Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file | |
| 2 // for details. All rights reserved. Use of this source code is governed by a | |
| 3 // BSD-style license that can be found in the LICENSE file. | |
| 4 | |
| 5 import 'package:front_end/src/fasta/parser/token_stream_rewriter.dart'; | |
| 6 import 'package:front_end/src/fasta/scanner/precedence.dart'; | |
| 7 import 'package:front_end/src/fasta/scanner/token.dart'; | |
| 8 import 'package:test/test.dart'; | |
| 9 import 'package:test_reflective_loader/test_reflective_loader.dart'; | |
|
ahe
2017/03/09 13:47:08
At some point we should talk about test frameworks
| |
| 10 | |
| 11 main() { | |
| 12 defineReflectiveSuite(() { | |
| 13 defineReflectiveTests(TokenStreamRewriterTest_NoPrevious); | |
| 14 defineReflectiveTests(TokenStreamRewriterTest_UsingPrevious); | |
| 15 }); | |
| 16 } | |
| 17 | |
| 18 /// Abstract base class for tests of [TokenStreamRewriter]. | |
| 19 abstract class TokenStreamRewriterTest { | |
| 20 /// Indicates whether the tests should set up [Token.previousToken]. | |
| 21 bool get setPrevious; | |
| 22 | |
| 23 void test_insert_at_end() { | |
| 24 var a = _makeToken(0, 'a'); | |
| 25 var b = _makeToken(1, 'b'); | |
| 26 var eof = _link([a]); | |
| 27 var rewriter = new TokenStreamRewriter(a); | |
| 28 rewriter.insertTokenBefore(b, eof); | |
| 29 expect(rewriter.firstToken, same(a)); | |
| 30 expect(a.next, same(b)); | |
| 31 expect(b.next, same(eof)); | |
| 32 expect(eof.previousToken, same(b)); | |
| 33 expect(b.previousToken, same(a)); | |
| 34 } | |
| 35 | |
| 36 void test_insert_at_start() { | |
| 37 var a = _makeToken(0, 'a'); | |
| 38 var b = _makeToken(1, 'b'); | |
| 39 _link([b]); | |
| 40 var rewriter = new TokenStreamRewriter(b); | |
| 41 rewriter.insertTokenBefore(a, b); | |
| 42 expect(rewriter.firstToken, same(a)); | |
| 43 expect(a.next, same(b)); | |
| 44 expect(a.previousToken.next, same(a)); | |
| 45 expect(b.previousToken, same(a)); | |
| 46 } | |
| 47 | |
| 48 void test_resume_at_previous_insertion_point() { | |
| 49 var a = _makeToken(0, 'a'); | |
| 50 var b = _makeToken(1, 'b'); | |
| 51 var c = _makeToken(2, 'c'); | |
| 52 var d = _makeToken(3, 'd'); | |
| 53 var e = _makeToken(4, 'e'); | |
| 54 _link([a, b, e]); | |
| 55 var rewriter = new TokenStreamRewriter(a); | |
| 56 rewriter.insertTokenBefore(d, e); | |
| 57 expect(b.next, same(d)); | |
| 58 expect(d.next, same(e)); | |
| 59 a.next = null; | |
| 60 // The next call to rewriter should be able to find the insertion point | |
| 61 // without using a.next. | |
| 62 rewriter.insertTokenBefore(c, d); | |
| 63 expect(b.next, same(c)); | |
| 64 expect(c.next, same(d)); | |
| 65 } | |
| 66 | |
| 67 void test_second_insertion_earlier_in_stream() { | |
| 68 var a = _makeToken(0, 'a'); | |
| 69 var b = _makeToken(1, 'b'); | |
| 70 var c = _makeToken(2, 'c'); | |
| 71 var d = _makeToken(3, 'd'); | |
| 72 var e = _makeToken(4, 'e'); | |
| 73 _link([a, c, e]); | |
| 74 var rewriter = new TokenStreamRewriter(a); | |
| 75 rewriter.insertTokenBefore(d, e); | |
| 76 expect(c.next, same(d)); | |
| 77 expect(d.next, same(e)); | |
| 78 // The next call to rewriter should be able to find the insertion point | |
| 79 // even though it is before the insertion point used above. | |
| 80 rewriter.insertTokenBefore(b, c); | |
| 81 expect(a.next, same(b)); | |
| 82 expect(b.next, same(c)); | |
| 83 } | |
| 84 | |
| 85 void test_skip_group() { | |
| 86 var a = _makeBeginGroupToken(0); | |
| 87 var b = _makeToken(1, 'b'); | |
| 88 var c = _makeToken(2, 'c'); | |
| 89 var d = _makeToken(3, 'd'); | |
| 90 var e = _makeToken(4, 'e'); | |
| 91 a.endGroup = c; | |
| 92 _link([a, b, c, e]); | |
| 93 // The rewriter should skip from a to c when finding the insertion position; | |
| 94 // we test this by corrupting b's next pointer. | |
| 95 b.next = null; | |
| 96 var rewriter = new TokenStreamRewriter(a); | |
| 97 rewriter.insertTokenBefore(d, e); | |
| 98 expect(c.next, same(d)); | |
| 99 expect(d.next, same(e)); | |
| 100 } | |
| 101 | |
| 102 /// Links together the given [tokens] and adds an EOF token to the end of the | |
| 103 /// token stream. | |
| 104 /// | |
| 105 /// The EOF token is returned. | |
| 106 Token _link(Iterable<Token> tokens) { | |
| 107 Token head = new SymbolToken(EOF_INFO, -1); | |
| 108 for (var token in tokens) { | |
| 109 head.next = token; | |
| 110 if (setPrevious) token.previousToken = head; | |
| 111 head = token; | |
| 112 } | |
| 113 int eofOffset = head.charOffset + head.value.length; | |
| 114 if (eofOffset < 0) eofOffset = 0; | |
| 115 Token eof = new SymbolToken(EOF_INFO, eofOffset); | |
| 116 head.next = eof; | |
| 117 if (setPrevious) eof.previousToken = head; | |
| 118 return eof; | |
| 119 } | |
| 120 | |
| 121 BeginGroupToken _makeBeginGroupToken(int charOffset) { | |
| 122 return new BeginGroupToken(OPEN_PAREN_INFO, charOffset); | |
| 123 } | |
| 124 | |
| 125 StringToken _makeToken(int charOffset, String text) { | |
| 126 return new StringToken.fromString(null, text, charOffset); | |
| 127 } | |
| 128 } | |
| 129 | |
| 130 /// Concrete implementation of [TokenStreamRewriterTest] in which | |
| 131 /// [Token.previousToken] values are set to null. | |
| 132 /// | |
| 133 /// This forces [TokenStreamRewriter] to use its more complex heursitc for | |
| 134 /// finding previous tokens. | |
| 135 @reflectiveTest | |
| 136 class TokenStreamRewriterTest_NoPrevious extends TokenStreamRewriterTest { | |
| 137 bool get setPrevious => false; | |
| 138 } | |
| 139 | |
| 140 /// Concrete implementation of [TokenStreamRewriterTest] in which | |
| 141 /// [Token.previousToken] values are set to non-null. | |
| 142 /// | |
| 143 /// Since [TokenStreamRewriter] makes use of [Token.previousToken] when it can, | |
| 144 /// these tests do not exercise the more complex heuristics for finding previous | |
| 145 /// tokens. | |
| 146 @reflectiveTest | |
| 147 class TokenStreamRewriterTest_UsingPrevious extends TokenStreamRewriterTest { | |
| 148 bool get setPrevious => true; | |
| 149 } | |
| OLD | NEW |