OLD | NEW |
(Empty) | |
| 1 import 'dart:mirrors' as m; |
| 2 import 'package:checked_mirrors/checked_mirrors.dart'; |
| 3 import 'package:checked_mirrors/control.dart' as control; |
| 4 |
| 5 import 'package:logging/logging.dart'; |
| 6 import 'package:unittest/unittest.dart'; |
| 7 import 'package:unittest/compact_vm_config.dart'; |
| 8 |
| 9 @MirrorsUsed(symbols: 'y', targets: const [B], metaTargets: const[Reflected]) |
| 10 const checked_mirrors_workaround_for_issue_10360 = 0; |
| 11 |
| 12 class Reflected { const Reflected(); } |
| 13 const reflected = const Reflected(); |
| 14 |
| 15 class A { |
| 16 int x = 1; |
| 17 int y = 2; // declared symbol 'y', but target is not declared either |
| 18 } |
| 19 |
| 20 class B { |
| 21 int x = 3; // covered by class B |
| 22 } |
| 23 |
| 24 @Reflected() // all symbols in this class are declared |
| 25 class C { |
| 26 int x = 4; |
| 27 int z = 5; |
| 28 } |
| 29 |
| 30 class D { |
| 31 @reflected int x = 6; |
| 32 int z = 7; // not declared |
| 33 } |
| 34 |
| 35 var a = new A(); |
| 36 var b = new B(); |
| 37 var c = new C(); |
| 38 var d = new D(); |
| 39 |
| 40 main() { |
| 41 hierarchicalLoggingEnabled = true; |
| 42 useCompactVMConfiguration(); |
| 43 |
| 44 var logger = new Logger('checked_mirrors'); |
| 45 logger.level = Level.ALL; |
| 46 final records = []; |
| 47 var firstError = null; |
| 48 var reportedErrors = 0; |
| 49 logger.onRecord.listen((r) { |
| 50 reportedErrors++; |
| 51 if (firstError == null) { |
| 52 firstError = r; |
| 53 return; |
| 54 } |
| 55 records.add(r); |
| 56 }); |
| 57 control.initialize(log: true, hints: 'my-hint-goes-here'); |
| 58 |
| 59 tearDown(() { |
| 60 try { |
| 61 // Ensure that each test accounts for all reported warnings. |
| 62 expect(records, hasLength(0)); |
| 63 if (reportedErrors > 0) { |
| 64 expect(firstError.message, |
| 65 '${control.FIRST_ERROR_MESSAGE}my-hint-goes-here'); |
| 66 } |
| 67 } finally { |
| 68 records.clear(); |
| 69 } |
| 70 }); |
| 71 |
| 72 group('get name,', () { |
| 73 test('default mirrors', () { |
| 74 expect(m.MirrorSystem.getName(#x), 'x'); |
| 75 expect(m.MirrorSystem.getSymbol('x'), #x); |
| 76 expect(m.MirrorSystem.getName(#y), 'y'); |
| 77 expect(m.MirrorSystem.getSymbol('y'), #y); |
| 78 }); |
| 79 |
| 80 test('symbol is declared', () { |
| 81 expect(MirrorSystem.getName(#y), 'y'); |
| 82 expect(MirrorSystem.getSymbol('y'), #y); |
| 83 }); |
| 84 |
| 85 test('symbol is not declared', () { |
| 86 expect(MirrorSystem.getName(#x), 'x'); |
| 87 expect(records.length, 1); // woo hoo! this was detected |
| 88 var r = records.removeLast(); |
| 89 expect(r.message, |
| 90 'Symbol "x" was used, but it is missing a @MirrorsUsed annotation.'); |
| 91 expect(MirrorSystem.getSymbol('x'), #x); |
| 92 expect(records.length, 1); |
| 93 r = records.removeLast(); |
| 94 expect(r.message, |
| 95 'Symbol "x" was used, but it is missing a @MirrorsUsed annotation.'); |
| 96 }); |
| 97 |
| 98 }); |
| 99 group('get field,', () { |
| 100 test('default mirrors', () { |
| 101 expect(m.reflect(a).getField(#y).reflectee, 2); |
| 102 expect(m.reflect(b).getField(#x).reflectee, 3); |
| 103 |
| 104 expect(m.reflect(c).getField(#x).reflectee, 4); |
| 105 expect(m.reflect(c).getField(#z).reflectee, 5); |
| 106 |
| 107 expect(m.reflect(d).getField(#x).reflectee, 6); |
| 108 expect(m.reflect(d).getField(#z).reflectee, 7); |
| 109 }); |
| 110 |
| 111 test('symbol is not declared', () { |
| 112 expect(reflect(a).getField(#x).reflectee, 1); |
| 113 expect(records.length, 1); |
| 114 var r = records.removeLast(); |
| 115 expect(r.message, 'Tried to access "A.x" via mirrors, ' |
| 116 'but it is missing a @MirrorsUsed annotation.'); |
| 117 }); |
| 118 |
| 119 test('even if symbol is declared', () { |
| 120 expect(reflect(a).getField(#y).reflectee, 2); |
| 121 expect(records.length, 1); |
| 122 var r = records.removeLast(); |
| 123 expect(r.message, 'Tried to access "A.y" via mirrors, ' |
| 124 'but it is missing a @MirrorsUsed annotation.'); |
| 125 }); |
| 126 |
| 127 test('target is declared', () { |
| 128 expect(reflect(b).getField(#x).reflectee, 3); |
| 129 }); |
| 130 |
| 131 test('meta target is declared on class', () { |
| 132 expect(reflect(c).getField(#x).reflectee, 4); |
| 133 expect(reflect(c).getField(#z).reflectee, 5); |
| 134 }); |
| 135 |
| 136 test('meta target is declared on field', () { |
| 137 expect(reflect(d).getField(#x).reflectee, 6); |
| 138 expect(reflect(d).getField(#z).reflectee, 7); |
| 139 expect(records, hasLength(1)); |
| 140 var r = records.removeLast(); |
| 141 expect(r.message, 'Tried to access "D.z" via mirrors, ' |
| 142 'but it is missing a @MirrorsUsed annotation.'); |
| 143 }); |
| 144 }); |
| 145 |
| 146 group('set field,', () { |
| 147 test('default mirrors', () { |
| 148 m.reflect(a).setField(#x, 101); |
| 149 m.reflect(a).setField(#y, 102); |
| 150 m.reflect(b).setField(#x, 103); |
| 151 m.reflect(c).setField(#x, 104); |
| 152 m.reflect(c).setField(#z, 105); |
| 153 m.reflect(d).setField(#x, 106); |
| 154 m.reflect(d).setField(#z, 107); |
| 155 |
| 156 expect(a.x, 101); |
| 157 expect(a.y, 102); |
| 158 expect(b.x, 103); |
| 159 expect(c.x, 104); |
| 160 expect(c.z, 105); |
| 161 expect(d.x, 106); |
| 162 expect(d.z, 107); |
| 163 }); |
| 164 |
| 165 test('symbol not declared', () { |
| 166 reflect(a).setField(#x, 201); |
| 167 expect(a.x, 201); |
| 168 expect(records.length, 1); |
| 169 var r = records.removeLast(); |
| 170 expect(r.message, 'Tried to access "A.x" via mirrors, ' |
| 171 'but it is missing a @MirrorsUsed annotation.'); |
| 172 }); |
| 173 |
| 174 test('even if symbol is declared', () { |
| 175 reflect(a).setField(#y, 202); |
| 176 expect(a.y, 202); |
| 177 expect(records.length, 1); |
| 178 var r = records.removeLast(); |
| 179 expect(r.message, 'Tried to access "A.y" via mirrors, ' |
| 180 'but it is missing a @MirrorsUsed annotation.'); |
| 181 }); |
| 182 |
| 183 test('target is declared', () { |
| 184 reflect(b).setField(#x, 203); |
| 185 expect(b.x, 203); |
| 186 }); |
| 187 |
| 188 test('meta target is declared on class', () { |
| 189 reflect(c).setField(#x, 204); |
| 190 reflect(c).setField(#z, 205); |
| 191 expect(c.x, 204); |
| 192 expect(c.z, 205); |
| 193 }); |
| 194 |
| 195 test('meta target is declared on field', () { |
| 196 reflect(d).setField(#x, 206); |
| 197 reflect(d).setField(#z, 207); |
| 198 expect(d.x, 206); |
| 199 expect(d.z, 207); |
| 200 expect(records, hasLength(1)); |
| 201 var r = records.removeLast(); |
| 202 expect(r.message, 'Tried to access "D.z" via mirrors, ' |
| 203 'but it is missing a @MirrorsUsed annotation.'); |
| 204 }); |
| 205 }); |
| 206 } |
OLD | NEW |