| // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | |
| // for details. All rights reserved. Use of this source code is governed by a | |
| // BSD-style license that can be found in the LICENSE file. | |
| // | |
| // VMOptions=--enable-ffi=true | |
| import "package:expect/expect.dart"; | |
| class ExpandoTest { | |
| static Expando<int> visits = Expando('visits'); | |
| static testMain() { | |
| var legal = [ | |
| new Object(), | |
| new List.filled(0, null), | |
| [1, 2, 3], | |
| const [1, 2, 3], | |
| new Map(), | |
| {'x': 1, 'y': 2}, | |
| const {'x': 1, 'y': 2}, | |
| new Expando(), | |
| new Expando('horse'), | |
| ]; | |
| for (var object in legal) { | |
| testNamedExpando(object); | |
| testUnnamedExpando(object); | |
| } | |
| for (var object in legal) { | |
| Expect.equals(2, visits[object], "$object"); | |
| } | |
| testIllegal(); | |
| testIdentity(); | |
| } | |
| static visit(object) { | |
| int? count = visits[object]; | |
| count = (count == null) ? 1 : count + 1; | |
| visits[object] = count; | |
| } | |
| static testNamedExpando(object) { | |
| Expando<int> expando = new Expando<int>('myexpando'); | |
| Expect.equals('myexpando', expando.name); | |
| Expect.isTrue(expando.toString().startsWith('Expando:myexpando')); | |
| testExpando(expando, object); | |
| } | |
| static testUnnamedExpando(object) { | |
| Expando<int> expando = new Expando<int>(); | |
| Expect.isNull(expando.name); | |
| Expect.isTrue(expando.toString().startsWith('Expando:')); | |
| testExpando(expando, object); | |
| } | |
| static testExpando(Expando<int> expando, object) { | |
| visit(object); | |
| Expect.isNull(expando[object]); | |
| expando[object] = 42; | |
| Expect.equals(42, expando[object]); | |
| expando[object] = null; | |
| Expect.isNull(expando[object]); | |
| Expando<int> alternative = new Expando('myexpando'); | |
| Expect.isNull(alternative[object]); | |
| alternative[object] = 87; | |
| Expect.isNull(expando[object]); | |
| expando[object] = 99; | |
| Expect.equals(99, expando[object]); | |
| Expect.equals(87, alternative[object]); | |
| } | |
| static testIllegal() { | |
| Expando<int> expando = new Expando<int>(); | |
| Expect.throwsArgumentError(() => expando['string'], "'string'"); | |
| Expect.throwsArgumentError(() => expando[42], "42"); | |
| Expect.throwsArgumentError(() => expando[42.87], "42.87"); | |
| Expect.throwsArgumentError(() => expando[true], "true"); | |
| Expect.throwsArgumentError(() => expando[false], "false"); | |
| } | |
| static testIdentity() { | |
| // Expando only depends on identity of object. | |
| Expando<int> expando = new Expando<int>(); | |
| var m1 = new Mutable(1); | |
| var m2 = new Mutable(7); | |
| var m3 = new Mutable(13); | |
| expando[m1] = 42; | |
| Expect.equals(42, expando[m1]); | |
| m1.id = 37; | |
| Expect.equals(42, expando[m1]); | |
| expando[m2] = 37; | |
| expando[m3] = 10; | |
| m3.id = 1; | |
| Expect.equals(42, expando[m1]); | |
| Expect.equals(37, expando[m2]); | |
| Expect.equals(10, expando[m3]); | |
| } | |
| } | |
| main() => ExpandoTest.testMain(); | |
| class Mutable { | |
| int id; | |
| Mutable(this.id); | |
| int get hashCode => id; | |
| bool operator ==(other) => other is Mutable && other.id == id; | |
| } |