Stack - consider empty external token state identical to NULL

This commit is contained in:
Max Brunsfeld 2017-06-28 16:13:28 -07:00
parent 5e3818882b
commit 66be393b78
2 changed files with 50 additions and 12 deletions

View file

@ -524,8 +524,10 @@ describe("Stack", [&]() {
describe("setting external token state", [&]() {
before_each([&]() {
trees[1]->external_token_state[0] = 'a';
trees[2]->external_token_state[0] = 'b';
trees[1]->has_external_tokens = true;
trees[2]->has_external_tokens = true;
memset(&trees[1]->external_token_state, 0, sizeof(TSExternalTokenState));
memset(&trees[2]->external_token_state, 0, sizeof(TSExternalTokenState));
});
it("allows the state to be retrieved", [&]() {
@ -535,19 +537,49 @@ describe("Stack", [&]() {
AssertThat(ts_stack_last_external_token(stack, 0), Equals(trees[1]));
ts_stack_copy_version(stack, 0);
AssertThat(ts_stack_last_external_token(stack, 0), Equals(trees[1]));
AssertThat(ts_stack_last_external_token(stack, 1), Equals(trees[1]));
ts_stack_set_last_external_token(stack, 0, trees[2]);
AssertThat(ts_stack_last_external_token(stack, 0), Equals(trees[2]));
});
it("does not merge stack versions with different external token states", [&]() {
trees[1]->external_token_state[5] = 'a';
trees[2]->external_token_state[5] = 'b';
ts_stack_copy_version(stack, 0);
ts_stack_push(stack, 0, trees[0], false, 5);
ts_stack_push(stack, 1, trees[0], false, 5);
ts_stack_set_last_external_token(stack, 0, trees[1]);
ts_stack_set_last_external_token(stack, 0, trees[1]);
ts_stack_set_last_external_token(stack, 1, trees[2]);
AssertThat(ts_stack_merge(stack, 0, 1), IsFalse());
});
it("merges stack versions with identical external token states", [&]() {
trees[1]->external_token_state[5] = 'a';
trees[2]->external_token_state[5] = 'a';
ts_stack_copy_version(stack, 0);
ts_stack_push(stack, 0, trees[0], false, 5);
ts_stack_push(stack, 1, trees[0], false, 5);
ts_stack_set_last_external_token(stack, 0, trees[1]);
ts_stack_set_last_external_token(stack, 1, trees[2]);
AssertThat(ts_stack_merge(stack, 0, 1), IsTrue());
});
it("does not distinguish between an *empty* external token state and *no* external token state", [&]() {
ts_stack_copy_version(stack, 0);
ts_stack_push(stack, 0, trees[0], false, 5);
ts_stack_push(stack, 1, trees[0], false, 5);
ts_stack_set_last_external_token(stack, 0, trees[1]);
AssertThat(ts_stack_merge(stack, 0, 1), IsTrue());
});
});
});