feat(change_detection): ensure that expression do not change after they have been checked

This commit is contained in:
vsavkin
2014-12-04 18:30:54 -08:00
parent d02e192951
commit 8acf9fb609
11 changed files with 123 additions and 27 deletions

View File

@ -20,7 +20,7 @@ import {Record} from 'change_detection/record';
export function main() {
function ast(exp:string) {
var parser = new Parser(new Lexer());
return parser.parseBinding(exp).ast;
return parser.parseBinding(exp);
}
function createChangeDetector(memo:string, exp:string, context = null, formatters = null,
@ -433,6 +433,27 @@ export function main() {
expect(dispatcher.loggedValues).toEqual(['InvokeA', ['a'], 'InvokeB', 'InvokeC', ['b', 'c']]);
});
});
describe("enforce no new changes", () => {
it("should throw when a record gets changed after it has been checked", () => {
var prr = new ProtoRecordRange();
prr.addRecordsFromAST(ast("a"), "a", 1);
prr.addRecordsFromAST(ast("b()"), "b", 2);
var tr = new TestRecord();
tr.a = "a";
tr.b = () => {tr.a = "newA";};
var dispatcher = new TestDispatcher();
var rr = prr.instantiate(dispatcher, null);
rr.setContext(tr);
expect(() => {
var cd = new ChangeDetector(rr, true);
cd.detectChanges();
}).toThrowError(new RegExp("Expression 'a' has changed after it was checked"));
});
});
});
});
}
@ -513,6 +534,6 @@ class TestDispatcher extends ChangeDispatcher {
}
_asString(value) {
return (value === null ? 'null' : value.toString());
return (isBlank(value) ? 'null' : value.toString());
}
}

View File

@ -45,7 +45,7 @@ export function main() {
}
function createRecord(rr) {
return new Record(rr, new ProtoRecord(null, 0, null, null, null, null, null), null);
return new Record(rr, new ProtoRecord(null, 0, null, null, null, null, null, null), null);
}
describe('record range', () => {