OLD | NEW |
---|---|
(Empty) | |
1 // Copyright 2016 the V8 project authors. All rights reserved. | |
vogelheim
2017/03/14 13:36:38
nitpick: 2017
vogelheim
2017/03/14 13:36:38
Please consider using unittests/.., rather than cc
bradn
2017/03/15 07:53:04
Done.
bradn
2017/03/15 07:53:04
Done.
Thanks for the suggestion!
| |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #include "src/asmjs/asm-lexer.h" | |
6 #include "src/v8.h" | |
7 #include "test/cctest/cctest.h" | |
8 | |
9 namespace v8 { | |
10 namespace internal { | |
11 | |
12 #define SKIP(t) \ | |
13 do { \ | |
14 CHECK_EQ((t), lexer.Token()); \ | |
15 lexer.Next(); \ | |
16 } while (0); | |
17 | |
18 #define TOK(t) AsmJsLexer::kToken_##t | |
19 | |
20 #define SKIP_GLOBAL() \ | |
21 do { \ | |
22 CHECK(lexer.IsGlobal()); \ | |
23 lexer.Next(); \ | |
24 } while (0); | |
25 | |
26 #define SKIP_LOCAL() \ | |
27 do { \ | |
28 CHECK(lexer.IsLocal()); \ | |
29 lexer.Next(); \ | |
30 } while (0); | |
31 | |
32 #define CHECK_FOR_END() CHECK(lexer.Token() == AsmJsLexer::kEndOfInput); | |
33 | |
34 #define SETUP_SOURCE(ssource) \ | |
35 v8::V8::Initialize(); \ | |
36 v8::Isolate* isolate = CcTest::isolate(); \ | |
37 v8::HandleScope handles(isolate); \ | |
38 i::Isolate* i_isolate = CcTest::i_isolate(); \ | |
39 i::Factory* factory = i_isolate->factory(); \ | |
40 i::Handle<i::String> source = factory->InternalizeUtf8String(ssource); \ | |
41 i::Handle<i::Script> script = factory->NewScript(source); \ | |
42 AsmJsLexer lexer(i_isolate, script, 0, source->length()); | |
43 | |
44 TEST(SimpleFunction) { | |
45 SETUP_SOURCE("function foo() { return; }"); | |
46 SKIP(TOK(function)); | |
47 DCHECK_EQ("foo", lexer.name()); | |
48 SKIP_GLOBAL(); | |
49 SKIP('('); | |
50 SKIP(')'); | |
51 SKIP('{'); | |
52 SKIP(TOK(return )); | |
53 SKIP(';'); | |
54 SKIP('}'); | |
55 CHECK_FOR_END(); | |
56 } | |
57 | |
58 TEST(JSKeywords) { | |
59 SETUP_SOURCE( | |
60 "arguments break case const continue\n" | |
61 "default do else eval for function\n" | |
62 "if new return switch var while\n"); | |
63 SKIP(TOK(arguments)); | |
64 SKIP(TOK(break)); | |
65 SKIP(TOK(case)); | |
66 SKIP(TOK(const)); | |
67 SKIP(TOK(continue)); | |
68 SKIP(TOK(default)); | |
69 SKIP(TOK(do)); | |
70 SKIP(TOK(else)); | |
71 SKIP(TOK(eval)); | |
72 SKIP(TOK(for)); | |
73 SKIP(TOK(function)); | |
74 SKIP(TOK(if)); | |
75 SKIP(TOK(new)); | |
76 SKIP(TOK(return )); | |
77 SKIP(TOK(switch)); | |
78 SKIP(TOK(var)); | |
79 SKIP(TOK(while)); | |
80 CHECK_FOR_END(); | |
81 } | |
82 | |
83 TEST(JSOperatorsSpread) { | |
84 SETUP_SOURCE( | |
85 "+ - * / % & | ^ ~ << >> >>>\n" | |
86 "< > <= >= == !=\n"); | |
87 SKIP('+'); | |
88 SKIP('-'); | |
89 SKIP('*'); | |
90 SKIP('/'); | |
91 SKIP('%'); | |
92 SKIP('&'); | |
93 SKIP('|'); | |
94 SKIP('^'); | |
95 SKIP('~'); | |
96 SKIP(TOK(SHL)); | |
97 SKIP(TOK(SAR)); | |
98 SKIP(TOK(SHR)); | |
99 SKIP('<'); | |
100 SKIP('>'); | |
101 SKIP(TOK(LE)); | |
102 SKIP(TOK(GE)); | |
103 SKIP(TOK(EQ)); | |
104 SKIP(TOK(NE)); | |
105 CHECK_FOR_END(); | |
106 } | |
107 | |
108 TEST(JSOperatorsTight) { | |
109 SETUP_SOURCE( | |
110 "+-*/%&|^~<<>> >>>\n" | |
111 "<><=>= ==!=\n"); | |
112 SKIP('+'); | |
113 SKIP('-'); | |
114 SKIP('*'); | |
115 SKIP('/'); | |
116 SKIP('%'); | |
117 SKIP('&'); | |
118 SKIP('|'); | |
119 SKIP('^'); | |
120 SKIP('~'); | |
121 SKIP(TOK(SHL)); | |
122 SKIP(TOK(SAR)); | |
123 SKIP(TOK(SHR)); | |
124 SKIP('<'); | |
125 SKIP('>'); | |
126 SKIP(TOK(LE)); | |
127 SKIP(TOK(GE)); | |
128 SKIP(TOK(EQ)); | |
129 SKIP(TOK(NE)); | |
130 CHECK_FOR_END(); | |
131 } | |
132 | |
133 TEST(UsesOfAsm) { | |
134 SETUP_SOURCE("'use asm' \"use asm\"\n"); | |
135 SKIP(TOK(UseAsm)); | |
136 SKIP(TOK(UseAsm)); | |
137 CHECK_FOR_END(); | |
138 } | |
139 | |
140 TEST(GlobalAssignment) { | |
141 SETUP_SOURCE("var x = x + x;"); | |
142 SKIP(TOK(var)); | |
143 CHECK_EQ("x", lexer.name()); | |
144 AsmJsLexer::token_t x = lexer.Token(); | |
145 SKIP_GLOBAL(); | |
146 SKIP('='); | |
147 SKIP(x); | |
148 SKIP('+'); | |
149 SKIP(x); | |
150 SKIP(';'); | |
151 CHECK_FOR_END(); | |
152 } | |
153 | |
154 TEST(LocalAssignment) { | |
155 SETUP_SOURCE("var x = x + x;"); | |
156 lexer.SetLocalScope(true); | |
157 SKIP(TOK(var)); | |
158 CHECK_EQ("x", lexer.name()); | |
159 AsmJsLexer::token_t x = lexer.Token(); | |
160 SKIP_LOCAL(); | |
161 SKIP('='); | |
162 SKIP(x); | |
163 SKIP('+'); | |
164 SKIP(x); | |
165 SKIP(';'); | |
166 CHECK_FOR_END(); | |
167 } | |
168 | |
169 TEST(Numbers) { | |
170 SETUP_SOURCE("1 1.2 0x1f 1.e3"); | |
171 | |
172 CHECK(lexer.IsUnsigned()); | |
173 CHECK_EQ(1, lexer.AsUnsigned()); | |
174 lexer.Next(); | |
175 | |
176 CHECK(lexer.IsDouble()); | |
177 CHECK_EQ(1.2, lexer.AsDouble()); | |
178 lexer.Next(); | |
179 | |
180 CHECK(lexer.IsUnsigned()); | |
181 CHECK_EQ(31, lexer.AsUnsigned()); | |
182 lexer.Next(); | |
183 | |
184 CHECK(lexer.IsDouble()); | |
185 CHECK_EQ(1.0e3, lexer.AsDouble()); | |
186 lexer.Next(); | |
187 | |
188 CHECK_FOR_END(); | |
189 } | |
190 | |
191 TEST(Rewind1) { | |
192 SETUP_SOURCE("+ - * /"); | |
193 SKIP('+'); | |
194 lexer.Rewind(); | |
195 SKIP('+'); | |
196 SKIP('-'); | |
197 lexer.Rewind(); | |
198 SKIP('-'); | |
199 SKIP('*'); | |
200 lexer.Rewind(); | |
201 SKIP('*'); | |
202 SKIP('/'); | |
203 lexer.Rewind(); | |
204 SKIP('/'); | |
205 CHECK_FOR_END(); | |
206 } | |
207 | |
208 TEST(Comments) { | |
209 SETUP_SOURCE( | |
210 "var // This is a test /* */\n" | |
211 "function /* this */ ^"); | |
212 SKIP(TOK(var)); | |
213 SKIP(TOK(function)); | |
214 SKIP('^'); | |
215 CHECK_FOR_END(); | |
216 } | |
217 | |
218 } // namespace internal | |
219 } // namespace v8 | |
OLD | NEW |