@@ -428,6 +428,82 @@ main() {
428
428
});
429
429
});
430
430
431
+ describe ('setters' , () {
432
+ it ('should set a field in a map' , () {
433
+ scope['map' ] = {};
434
+ eval ('map["square"] = 6' );
435
+ eval ('map.dot = 7' );
436
+
437
+ expect (scope['map' ]['square' ]).toEqual (6 );
438
+ expect (scope['map' ]['dot' ]).toEqual (7 );
439
+ });
440
+
441
+
442
+ it ('should set a field in a list' , () {
443
+ scope['list' ] = [];
444
+ eval ('list[3] = 2' );
445
+
446
+ expect (scope['list' ].length).toEqual (4 );
447
+ expect (scope['list' ][3 ]).toEqual (2 );
448
+ });
449
+
450
+
451
+ it ('should set a field on an object' , () {
452
+ scope['obj' ] = new SetterObject ();
453
+ eval ('obj.field = 1' );
454
+
455
+ expect (scope['obj' ].field).toEqual (1 );
456
+ });
457
+
458
+
459
+ it ('should set a setter on an object' , () {
460
+ scope['obj' ] = new SetterObject ();
461
+ eval ('obj.setter = 2' );
462
+
463
+ expect (scope['obj' ].setterValue).toEqual (2 );
464
+ });
465
+
466
+
467
+ it ('should set a []= on an object' , () {
468
+ scope['obj' ] = new OverloadObject ();
469
+ eval ('obj.overload = 7' );
470
+
471
+ expect (scope['obj' ].overloadValue).toEqual (7 );
472
+ });
473
+
474
+
475
+ it ('should set a field in a nested map on an object' , () {
476
+ scope['obj' ] = new SetterObject ();
477
+ eval ('obj.map.mapKey = 3' );
478
+
479
+ expect (scope['obj' ].map['mapKey' ]).toEqual (3 );
480
+ });
481
+
482
+
483
+ it ('should set a field in a nested object on an object' , () {
484
+ scope['obj' ] = new SetterObject ();
485
+ eval ('obj.nested.field = 1' );
486
+
487
+ expect (scope['obj' ].nested.field).toEqual (1 );
488
+ });
489
+
490
+
491
+ it ('should create a map for dotted acces' , () {
492
+ scope['obj' ] = new SetterObject ();
493
+ eval ('obj.field.key = 4' );
494
+
495
+ expect (scope['obj' ].field['key' ]).toEqual (4 );
496
+ });
497
+
498
+
499
+ it ('should throw a nice error for type mismatch' , () {
500
+ scope['obj' ] = new SetterObject ();
501
+ expect (() {
502
+ eval ('obj.integer = "hello"' );
503
+ }).toThrow ("Eval Error: Caught type 'String' is not a subtype of type 'int' of 'value'. while evaling [obj.integer = \" hello\" ]" );
504
+ });
505
+ });
506
+
431
507
describe ('test cases imported from AngularJS' , () {
432
508
//// ==== IMPORTED ITs
433
509
it ('should parse expressions' , () {
@@ -809,6 +885,25 @@ main() {
809
885
});
810
886
}
811
887
888
+ class SetterObject {
889
+ var field;
890
+ int integer;
891
+ var map = {};
892
+
893
+ var nest;
894
+ SetterObject get nested => nest != null ? nest : (nest = new SetterObject ());
895
+
896
+ var setterValue;
897
+ void set setter (x) { setterValue = x; }
898
+ }
899
+
900
+ class OverloadObject {
901
+ var overloadValue;
902
+ operator []= (String name, var value) {
903
+ overloadValue = value;
904
+ }
905
+ }
906
+
812
907
class ScopeWithErrors {
813
908
String get boo { dump ("got a boo" ); throw "boo to you" ; }
814
909
String foo () { dump ("got a foo" ); throw "foo to you" ; }
0 commit comments