• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2019 The Amber Authors.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //     http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or parseried.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 #include "gtest/gtest.h"
16 #include "src/amberscript/parser.h"
17 
18 namespace amber {
19 namespace amberscript {
20 
21 using AmberScriptParserTest = testing::Test;
22 
TEST_F(AmberScriptParserTest,RunCompute)23 TEST_F(AmberScriptParserTest, RunCompute) {
24   std::string in = R"(
25 SHADER compute my_shader GLSL
26 void main() {
27   gl_FragColor = vec3(2, 3, 4);
28 }
29 END
30 
31 PIPELINE compute my_pipeline
32   ATTACH my_shader
33 END
34 
35 RUN my_pipeline 2 4 5
36 )";
37 
38   Parser parser;
39   Result r = parser.Parse(in);
40   ASSERT_TRUE(r.IsSuccess()) << r.Error();
41 
42   auto script = parser.GetScript();
43   const auto& commands = script->GetCommands();
44   ASSERT_EQ(1U, commands.size());
45 
46   auto* cmd = commands[0].get();
47   ASSERT_TRUE(cmd->IsCompute());
48   EXPECT_EQ(2U, cmd->AsCompute()->GetX());
49   EXPECT_EQ(4U, cmd->AsCompute()->GetY());
50   EXPECT_EQ(5U, cmd->AsCompute()->GetZ());
51 }
52 
TEST_F(AmberScriptParserTest,RunWithoutPipeline)53 TEST_F(AmberScriptParserTest, RunWithoutPipeline) {
54   std::string in = R"(RUN 2 4 5)";
55 
56   Parser parser;
57   Result r = parser.Parse(in);
58   ASSERT_FALSE(r.IsSuccess());
59   ASSERT_EQ("1: missing pipeline name for RUN command", r.Error());
60 }
61 
TEST_F(AmberScriptParserTest,RunWithInvalidPipeline)62 TEST_F(AmberScriptParserTest, RunWithInvalidPipeline) {
63   std::string in = R"(RUN unknown_pipeline 2 4 5)";
64 
65   Parser parser;
66   Result r = parser.Parse(in);
67   ASSERT_FALSE(r.IsSuccess());
68   ASSERT_EQ("1: unknown pipeline for RUN command: unknown_pipeline", r.Error());
69 }
70 
TEST_F(AmberScriptParserTest,RunComputeWithGraphicsPipeline)71 TEST_F(AmberScriptParserTest, RunComputeWithGraphicsPipeline) {
72   std::string in = R"(
73 SHADER vertex my_shader PASSTHROUGH
74 SHADER fragment my_fragment GLSL
75 # GLSL Shader
76 END
77 
78 PIPELINE graphics my_pipeline
79   ATTACH my_shader
80   ATTACH my_fragment
81 END
82 
83 RUN my_pipeline 2 4 5)";
84 
85   Parser parser;
86   Result r = parser.Parse(in);
87   ASSERT_FALSE(r.IsSuccess());
88   ASSERT_EQ("12: RUN command requires compute pipeline", r.Error());
89 }
90 
TEST_F(AmberScriptParserTest,RunComputeMissingParams)91 TEST_F(AmberScriptParserTest, RunComputeMissingParams) {
92   std::string in = R"(
93 SHADER compute my_shader GLSL
94 void main() {
95   gl_FragColor = vec3(2, 3, 4);
96 }
97 END
98 
99 PIPELINE compute my_pipeline
100   ATTACH my_shader
101 END
102 
103 RUN my_pipeline)";
104 
105   Parser parser;
106   Result r = parser.Parse(in);
107   ASSERT_FALSE(r.IsSuccess());
108   ASSERT_EQ("12: RUN command requires parameters", r.Error());
109 }
110 
TEST_F(AmberScriptParserTest,RunComputeExtraParams)111 TEST_F(AmberScriptParserTest, RunComputeExtraParams) {
112   std::string in = R"(
113 SHADER compute my_shader GLSL
114 void main() {
115   gl_FragColor = vec3(2, 3, 4);
116 }
117 END
118 
119 PIPELINE compute my_pipeline
120   ATTACH my_shader
121 END
122 
123 RUN my_pipeline 2 4 5 EXTRA)";
124 
125   Parser parser;
126   Result r = parser.Parse(in);
127   ASSERT_FALSE(r.IsSuccess());
128   ASSERT_EQ("12: extra parameters after RUN command: EXTRA", r.Error());
129 }
130 
TEST_F(AmberScriptParserTest,RunComputeInvalidZ)131 TEST_F(AmberScriptParserTest, RunComputeInvalidZ) {
132   std::string in = R"(
133 SHADER compute my_shader GLSL
134 void main() {
135   gl_FragColor = vec3(2, 3, 4);
136 }
137 END
138 
139 PIPELINE compute my_pipeline
140   ATTACH my_shader
141 END
142 
143 RUN my_pipeline 2 4 INVALID)";
144 
145   Parser parser;
146   Result r = parser.Parse(in);
147   ASSERT_FALSE(r.IsSuccess());
148   ASSERT_EQ("12: invalid parameter for RUN command: INVALID", r.Error());
149 }
150 
TEST_F(AmberScriptParserTest,RunComputeInvalidY)151 TEST_F(AmberScriptParserTest, RunComputeInvalidY) {
152   std::string in = R"(
153 SHADER compute my_shader GLSL
154 void main() {
155   gl_FragColor = vec3(2, 3, 4);
156 }
157 END
158 
159 PIPELINE compute my_pipeline
160   ATTACH my_shader
161 END
162 
163 RUN my_pipeline 2 INVALID 5)";
164 
165   Parser parser;
166   Result r = parser.Parse(in);
167   ASSERT_FALSE(r.IsSuccess());
168   ASSERT_EQ("12: invalid parameter for RUN command: INVALID", r.Error());
169 }
170 
TEST_F(AmberScriptParserTest,RunComputeInvalidX)171 TEST_F(AmberScriptParserTest, RunComputeInvalidX) {
172   std::string in = R"(
173 SHADER compute my_shader GLSL
174 void main() {
175   gl_FragColor = vec3(2, 3, 4);
176 }
177 END
178 
179 PIPELINE compute my_pipeline
180   ATTACH my_shader
181 END
182 
183 RUN my_pipeline INVALID 4 5)";
184 
185   Parser parser;
186   Result r = parser.Parse(in);
187   ASSERT_FALSE(r.IsSuccess());
188   ASSERT_EQ("12: invalid token in RUN command: INVALID", r.Error());
189 }
190 
TEST_F(AmberScriptParserTest,RunDrawRect)191 TEST_F(AmberScriptParserTest, RunDrawRect) {
192   std::string in = R"(
193 SHADER vertex my_shader PASSTHROUGH
194 SHADER fragment my_fragment GLSL
195 # GLSL Shader
196 END
197 
198 PIPELINE graphics my_pipeline
199   ATTACH my_shader
200   ATTACH my_fragment
201 END
202 
203 RUN my_pipeline DRAW_RECT POS 2 4 SIZE 10 20)";
204 
205   Parser parser;
206   Result r = parser.Parse(in);
207   ASSERT_TRUE(r.IsSuccess()) << r.Error();
208 
209   auto script = parser.GetScript();
210   const auto& commands = script->GetCommands();
211   ASSERT_EQ(1U, commands.size());
212 
213   auto* cmd = commands[0].get();
214   ASSERT_TRUE(cmd->IsDrawRect());
215   EXPECT_TRUE(cmd->AsDrawRect()->IsOrtho());
216   EXPECT_FALSE(cmd->AsDrawRect()->IsPatch());
217   EXPECT_FLOAT_EQ(2.f, cmd->AsDrawRect()->GetX());
218   EXPECT_FLOAT_EQ(4.f, cmd->AsDrawRect()->GetY());
219   EXPECT_FLOAT_EQ(10.f, cmd->AsDrawRect()->GetWidth());
220   EXPECT_FLOAT_EQ(20.f, cmd->AsDrawRect()->GetHeight());
221 }
222 
TEST_F(AmberScriptParserTest,RunDrawRectWithComputePipelineInvalid)223 TEST_F(AmberScriptParserTest, RunDrawRectWithComputePipelineInvalid) {
224   std::string in = R"(
225 SHADER compute my_shader GLSL
226 void main() {
227   gl_FragColor = vec3(2, 3, 4);
228 }
229 END
230 
231 PIPELINE compute my_pipeline
232   ATTACH my_shader
233 END
234 
235 RUN my_pipeline DRAW_RECT POS 2 4 SIZE 10 20)";
236 
237   Parser parser;
238   Result r = parser.Parse(in);
239   ASSERT_FALSE(r.IsSuccess());
240   ASSERT_EQ("12: RUN command requires graphics pipeline", r.Error());
241 }
242 
TEST_F(AmberScriptParserTest,RunDrawRectWithMissingPipeline)243 TEST_F(AmberScriptParserTest, RunDrawRectWithMissingPipeline) {
244   std::string in = R"(RUN my_pipeline DRAW_RECT POS 2 4 SIZE 10 20)";
245 
246   Parser parser;
247   Result r = parser.Parse(in);
248   ASSERT_FALSE(r.IsSuccess());
249   ASSERT_EQ("1: unknown pipeline for RUN command: my_pipeline", r.Error());
250 }
251 
TEST_F(AmberScriptParserTest,RunDrawRectMissingValues)252 TEST_F(AmberScriptParserTest, RunDrawRectMissingValues) {
253   std::string in = R"(
254 SHADER vertex my_shader PASSTHROUGH
255 SHADER fragment my_fragment GLSL
256 # GLSL Shader
257 END
258 
259 PIPELINE graphics my_pipeline
260   ATTACH my_shader
261   ATTACH my_fragment
262 END
263 
264 RUN my_pipeline DRAW_RECT)";
265 
266   Parser parser;
267   Result r = parser.Parse(in);
268   ASSERT_FALSE(r.IsSuccess());
269   ASSERT_EQ("12: RUN DRAW_RECT command requires parameters", r.Error());
270 }
271 
TEST_F(AmberScriptParserTest,RunDrawRectMissingPOS)272 TEST_F(AmberScriptParserTest, RunDrawRectMissingPOS) {
273   std::string in = R"(
274 SHADER vertex my_shader PASSTHROUGH
275 SHADER fragment my_fragment GLSL
276 # GLSL Shader
277 END
278 
279 PIPELINE graphics my_pipeline
280   ATTACH my_shader
281   ATTACH my_fragment
282 END
283 
284 RUN my_pipeline DRAW_RECT 2 4 SIZE 10 20)";
285 
286   Parser parser;
287   Result r = parser.Parse(in);
288   ASSERT_FALSE(r.IsSuccess());
289   ASSERT_EQ("12: invalid token in RUN command: 2; expected POS", r.Error());
290 }
291 
TEST_F(AmberScriptParserTest,RunDrawRectPOSMissingValues)292 TEST_F(AmberScriptParserTest, RunDrawRectPOSMissingValues) {
293   std::string in = R"(
294 SHADER vertex my_shader PASSTHROUGH
295 SHADER fragment my_fragment GLSL
296 # GLSL Shader
297 END
298 
299 PIPELINE graphics my_pipeline
300   ATTACH my_shader
301   ATTACH my_fragment
302 END
303 
304 RUN my_pipeline DRAW_RECT POS SIZE 10 20)";
305 
306   Parser parser;
307   Result r = parser.Parse(in);
308   ASSERT_FALSE(r.IsSuccess());
309   ASSERT_EQ("12: missing X position for RUN command", r.Error());
310 }
311 
TEST_F(AmberScriptParserTest,RunDrawRectMissingPOSY)312 TEST_F(AmberScriptParserTest, RunDrawRectMissingPOSY) {
313   std::string in = R"(
314 SHADER vertex my_shader PASSTHROUGH
315 SHADER fragment my_fragment GLSL
316 # GLSL Shader
317 END
318 
319 PIPELINE graphics my_pipeline
320   ATTACH my_shader
321   ATTACH my_fragment
322 END
323 
324 RUN my_pipeline DRAW_RECT POS 2 SIZE 10 20)";
325 
326   Parser parser;
327   Result r = parser.Parse(in);
328   ASSERT_FALSE(r.IsSuccess());
329   ASSERT_EQ("12: missing Y position for RUN command", r.Error());
330 }
331 
TEST_F(AmberScriptParserTest,RunDrawRectInvalidPOSX)332 TEST_F(AmberScriptParserTest, RunDrawRectInvalidPOSX) {
333   std::string in = R"(
334 SHADER vertex my_shader PASSTHROUGH
335 SHADER fragment my_fragment GLSL
336 # GLSL Shader
337 END
338 
339 PIPELINE graphics my_pipeline
340   ATTACH my_shader
341   ATTACH my_fragment
342 END
343 
344 RUN my_pipeline DRAW_RECT POS INVALID 4 SIZE 10 20)";
345 
346   Parser parser;
347   Result r = parser.Parse(in);
348   ASSERT_FALSE(r.IsSuccess());
349   ASSERT_EQ("12: missing X position for RUN command", r.Error());
350 }
351 
TEST_F(AmberScriptParserTest,RunDrawRectInavlidPOSY)352 TEST_F(AmberScriptParserTest, RunDrawRectInavlidPOSY) {
353   std::string in = R"(
354 SHADER vertex my_shader PASSTHROUGH
355 SHADER fragment my_fragment GLSL
356 # GLSL Shader
357 END
358 
359 PIPELINE graphics my_pipeline
360   ATTACH my_shader
361   ATTACH my_fragment
362 END
363 
364 RUN my_pipeline DRAW_RECT POS 2 INVALID SIZE 10 20)";
365 
366   Parser parser;
367   Result r = parser.Parse(in);
368   ASSERT_FALSE(r.IsSuccess());
369   ASSERT_EQ("12: missing Y position for RUN command", r.Error());
370 }
371 
TEST_F(AmberScriptParserTest,RunDrawRectMissingSize)372 TEST_F(AmberScriptParserTest, RunDrawRectMissingSize) {
373   std::string in = R"(
374 SHADER vertex my_shader PASSTHROUGH
375 SHADER fragment my_fragment GLSL
376 # GLSL Shader
377 END
378 
379 PIPELINE graphics my_pipeline
380   ATTACH my_shader
381   ATTACH my_fragment
382 END
383 
384 RUN my_pipeline DRAW_RECT POS 2 4 10 20)";
385 
386   Parser parser;
387   Result r = parser.Parse(in);
388   ASSERT_FALSE(r.IsSuccess());
389   ASSERT_EQ("12: invalid token in RUN command: 10; expected SIZE", r.Error());
390 }
391 
TEST_F(AmberScriptParserTest,RunDrawRectMissingSizeValues)392 TEST_F(AmberScriptParserTest, RunDrawRectMissingSizeValues) {
393   std::string in = R"(
394 SHADER vertex my_shader PASSTHROUGH
395 SHADER fragment my_fragment GLSL
396 # GLSL Shader
397 END
398 
399 PIPELINE graphics my_pipeline
400   ATTACH my_shader
401   ATTACH my_fragment
402 END
403 
404 RUN my_pipeline DRAW_RECT POS 2 4 SIZE)";
405 
406   Parser parser;
407   Result r = parser.Parse(in);
408   ASSERT_FALSE(r.IsSuccess());
409   ASSERT_EQ("12: missing width value for RUN command", r.Error());
410 }
411 
TEST_F(AmberScriptParserTest,RunDrawRectMissingSizeHeight)412 TEST_F(AmberScriptParserTest, RunDrawRectMissingSizeHeight) {
413   std::string in = R"(
414 SHADER vertex my_shader PASSTHROUGH
415 SHADER fragment my_fragment GLSL
416 # GLSL Shader
417 END
418 
419 PIPELINE graphics my_pipeline
420   ATTACH my_shader
421   ATTACH my_fragment
422 END
423 
424 RUN my_pipeline DRAW_RECT POS 2 4 SIZE 10)";
425 
426   Parser parser;
427   Result r = parser.Parse(in);
428   ASSERT_FALSE(r.IsSuccess());
429   ASSERT_EQ("12: missing height value for RUN command", r.Error());
430 }
431 
TEST_F(AmberScriptParserTest,RunDrawRectInvalidSizeWidth)432 TEST_F(AmberScriptParserTest, RunDrawRectInvalidSizeWidth) {
433   std::string in = R"(
434 SHADER vertex my_shader PASSTHROUGH
435 SHADER fragment my_fragment GLSL
436 # GLSL Shader
437 END
438 
439 PIPELINE graphics my_pipeline
440   ATTACH my_shader
441   ATTACH my_fragment
442 END
443 
444 RUN my_pipeline DRAW_RECT POS 2 4 SIZE INVALID 20)";
445 
446   Parser parser;
447   Result r = parser.Parse(in);
448   ASSERT_FALSE(r.IsSuccess());
449   ASSERT_EQ("12: missing width value for RUN command", r.Error());
450 }
451 
TEST_F(AmberScriptParserTest,RunDrawRectInvalidSizeHeight)452 TEST_F(AmberScriptParserTest, RunDrawRectInvalidSizeHeight) {
453   std::string in = R"(
454 SHADER vertex my_shader PASSTHROUGH
455 SHADER fragment my_fragment GLSL
456 # GLSL Shader
457 END
458 
459 PIPELINE graphics my_pipeline
460   ATTACH my_shader
461   ATTACH my_fragment
462 END
463 
464 RUN my_pipeline DRAW_RECT POS 2 4 SIZE 10 INVALID)";
465 
466   Parser parser;
467   Result r = parser.Parse(in);
468   ASSERT_FALSE(r.IsSuccess());
469   ASSERT_EQ("12: missing height value for RUN command", r.Error());
470 }
471 
TEST_F(AmberScriptParserTest,RunDrawRectExtraCommands)472 TEST_F(AmberScriptParserTest, RunDrawRectExtraCommands) {
473   std::string in = R"(
474 SHADER vertex my_shader PASSTHROUGH
475 SHADER fragment my_fragment GLSL
476 # GLSL Shader
477 END
478 
479 PIPELINE graphics my_pipeline
480   ATTACH my_shader
481   ATTACH my_fragment
482 END
483 
484 RUN my_pipeline DRAW_RECT POS 2 4 SIZE 10 20 EXTRA)";
485 
486   Parser parser;
487   Result r = parser.Parse(in);
488   ASSERT_FALSE(r.IsSuccess());
489   ASSERT_EQ("12: extra parameters after RUN command: EXTRA", r.Error());
490 }
491 
TEST_F(AmberScriptParserTest,RunDrawGrid)492 TEST_F(AmberScriptParserTest, RunDrawGrid) {
493   std::string in = R"(
494 SHADER vertex my_shader PASSTHROUGH
495 SHADER fragment my_fragment GLSL
496 # GLSL Shader
497 END
498 
499 PIPELINE graphics my_pipeline
500   ATTACH my_shader
501   ATTACH my_fragment
502 END
503 
504 RUN my_pipeline DRAW_GRID POS 2 4 SIZE 10 20 CELLS 4 5)";
505 
506   Parser parser;
507   Result r = parser.Parse(in);
508   ASSERT_TRUE(r.IsSuccess()) << r.Error();
509 
510   auto script = parser.GetScript();
511   const auto& commands = script->GetCommands();
512   ASSERT_EQ(1U, commands.size());
513 
514   auto* cmd = commands[0].get();
515   ASSERT_TRUE(cmd->IsDrawGrid());
516   EXPECT_FLOAT_EQ(2.f, cmd->AsDrawGrid()->GetX());
517   EXPECT_FLOAT_EQ(4.f, cmd->AsDrawGrid()->GetY());
518   EXPECT_FLOAT_EQ(10.f, cmd->AsDrawGrid()->GetWidth());
519   EXPECT_FLOAT_EQ(20.f, cmd->AsDrawGrid()->GetHeight());
520   EXPECT_EQ(4u, cmd->AsDrawGrid()->GetColumns());
521   EXPECT_EQ(5u, cmd->AsDrawGrid()->GetRows());
522 }
523 
TEST_F(AmberScriptParserTest,RunDrawGridWithComputePipelineInvalid)524 TEST_F(AmberScriptParserTest, RunDrawGridWithComputePipelineInvalid) {
525   std::string in = R"(
526 SHADER compute my_shader GLSL
527 void main() {
528   gl_FragColor = vec3(2, 3, 4);
529 }
530 END
531 
532 PIPELINE compute my_pipeline
533   ATTACH my_shader
534 END
535 
536 RUN my_pipeline DRAW_GRID POS 2 4 SIZE 10 20 CELLS 4 4)";
537 
538   Parser parser;
539   Result r = parser.Parse(in);
540   ASSERT_FALSE(r.IsSuccess());
541   ASSERT_EQ("12: RUN command requires graphics pipeline", r.Error());
542 }
543 
TEST_F(AmberScriptParserTest,RunDrawGridWithMissingPipeline)544 TEST_F(AmberScriptParserTest, RunDrawGridWithMissingPipeline) {
545   std::string in = R"(RUN my_pipeline DRAW_GRID POS 2 4 SIZE 10 20 CELLS 4 4)";
546 
547   Parser parser;
548   Result r = parser.Parse(in);
549   ASSERT_FALSE(r.IsSuccess());
550   ASSERT_EQ("1: unknown pipeline for RUN command: my_pipeline", r.Error());
551 }
552 
TEST_F(AmberScriptParserTest,RunDrawGridMissingValues)553 TEST_F(AmberScriptParserTest, RunDrawGridMissingValues) {
554   std::string in = R"(
555 SHADER vertex my_shader PASSTHROUGH
556 SHADER fragment my_fragment GLSL
557 # GLSL Shader
558 END
559 
560 PIPELINE graphics my_pipeline
561   ATTACH my_shader
562   ATTACH my_fragment
563 END
564 
565 RUN my_pipeline DRAW_GRID)";
566 
567   Parser parser;
568   Result r = parser.Parse(in);
569   ASSERT_FALSE(r.IsSuccess());
570   ASSERT_EQ("12: RUN DRAW_GRID command requires parameters", r.Error());
571 }
572 
TEST_F(AmberScriptParserTest,RunDrawGridMissingPOS)573 TEST_F(AmberScriptParserTest, RunDrawGridMissingPOS) {
574   std::string in = R"(
575 SHADER vertex my_shader PASSTHROUGH
576 SHADER fragment my_fragment GLSL
577 # GLSL Shader
578 END
579 
580 PIPELINE graphics my_pipeline
581   ATTACH my_shader
582   ATTACH my_fragment
583 END
584 
585 RUN my_pipeline DRAW_GRID 2 4 SIZE 10 20 CELLS 4 4)";
586 
587   Parser parser;
588   Result r = parser.Parse(in);
589   ASSERT_FALSE(r.IsSuccess());
590   ASSERT_EQ("12: invalid token in RUN command: 2; expected POS", r.Error());
591 }
592 
TEST_F(AmberScriptParserTest,RunDrawGridPOSMissingValues)593 TEST_F(AmberScriptParserTest, RunDrawGridPOSMissingValues) {
594   std::string in = R"(
595 SHADER vertex my_shader PASSTHROUGH
596 SHADER fragment my_fragment GLSL
597 # GLSL Shader
598 END
599 
600 PIPELINE graphics my_pipeline
601   ATTACH my_shader
602   ATTACH my_fragment
603 END
604 
605 RUN my_pipeline DRAW_GRID POS SIZE 10 20 CELLS 4 4)";
606 
607   Parser parser;
608   Result r = parser.Parse(in);
609   ASSERT_FALSE(r.IsSuccess());
610   ASSERT_EQ("12: missing X position for RUN command", r.Error());
611 }
612 
TEST_F(AmberScriptParserTest,RunDrawGridMissingPOSY)613 TEST_F(AmberScriptParserTest, RunDrawGridMissingPOSY) {
614   std::string in = R"(
615 SHADER vertex my_shader PASSTHROUGH
616 SHADER fragment my_fragment GLSL
617 # GLSL Shader
618 END
619 
620 PIPELINE graphics my_pipeline
621   ATTACH my_shader
622   ATTACH my_fragment
623 END
624 
625 RUN my_pipeline DRAW_GRID POS 2 SIZE 10 20 CELLS 4 4)";
626 
627   Parser parser;
628   Result r = parser.Parse(in);
629   ASSERT_FALSE(r.IsSuccess());
630   ASSERT_EQ("12: missing Y position for RUN command", r.Error());
631 }
632 
TEST_F(AmberScriptParserTest,RunDrawGridInvalidPOSX)633 TEST_F(AmberScriptParserTest, RunDrawGridInvalidPOSX) {
634   std::string in = R"(
635 SHADER vertex my_shader PASSTHROUGH
636 SHADER fragment my_fragment GLSL
637 # GLSL Shader
638 END
639 
640 PIPELINE graphics my_pipeline
641   ATTACH my_shader
642   ATTACH my_fragment
643 END
644 
645 RUN my_pipeline DRAW_GRID POS INVALID 4 SIZE 10 20 CELLS 4 4)";
646 
647   Parser parser;
648   Result r = parser.Parse(in);
649   ASSERT_FALSE(r.IsSuccess());
650   ASSERT_EQ("12: missing X position for RUN command", r.Error());
651 }
652 
TEST_F(AmberScriptParserTest,RunDrawGridInavlidPOSY)653 TEST_F(AmberScriptParserTest, RunDrawGridInavlidPOSY) {
654   std::string in = R"(
655 SHADER vertex my_shader PASSTHROUGH
656 SHADER fragment my_fragment GLSL
657 # GLSL Shader
658 END
659 
660 PIPELINE graphics my_pipeline
661   ATTACH my_shader
662   ATTACH my_fragment
663 END
664 
665 RUN my_pipeline DRAW_GRID POS 2 INVALID SIZE 10 20 CELLS 4 4)";
666 
667   Parser parser;
668   Result r = parser.Parse(in);
669   ASSERT_FALSE(r.IsSuccess());
670   ASSERT_EQ("12: missing Y position for RUN command", r.Error());
671 }
672 
TEST_F(AmberScriptParserTest,RunDrawGridMissingSize)673 TEST_F(AmberScriptParserTest, RunDrawGridMissingSize) {
674   std::string in = R"(
675 SHADER vertex my_shader PASSTHROUGH
676 SHADER fragment my_fragment GLSL
677 # GLSL Shader
678 END
679 
680 PIPELINE graphics my_pipeline
681   ATTACH my_shader
682   ATTACH my_fragment
683 END
684 
685 RUN my_pipeline DRAW_GRID POS 2 4 10 20 CELLS 4 4)";
686 
687   Parser parser;
688   Result r = parser.Parse(in);
689   ASSERT_FALSE(r.IsSuccess());
690   ASSERT_EQ("12: invalid token in RUN command: 10; expected SIZE", r.Error());
691 }
692 
TEST_F(AmberScriptParserTest,RunDrawGridMissingSizeValues)693 TEST_F(AmberScriptParserTest, RunDrawGridMissingSizeValues) {
694   std::string in = R"(
695 SHADER vertex my_shader PASSTHROUGH
696 SHADER fragment my_fragment GLSL
697 # GLSL Shader
698 END
699 
700 PIPELINE graphics my_pipeline
701   ATTACH my_shader
702   ATTACH my_fragment
703 END
704 
705 RUN my_pipeline DRAW_GRID POS 2 4 SIZE CELLS 4 4)";
706 
707   Parser parser;
708   Result r = parser.Parse(in);
709   ASSERT_FALSE(r.IsSuccess());
710   ASSERT_EQ("12: missing width value for RUN command", r.Error());
711 }
712 
TEST_F(AmberScriptParserTest,RunDrawGridMissingSizeHeight)713 TEST_F(AmberScriptParserTest, RunDrawGridMissingSizeHeight) {
714   std::string in = R"(
715 SHADER vertex my_shader PASSTHROUGH
716 SHADER fragment my_fragment GLSL
717 # GLSL Shader
718 END
719 
720 PIPELINE graphics my_pipeline
721   ATTACH my_shader
722   ATTACH my_fragment
723 END
724 
725 RUN my_pipeline DRAW_GRID POS 2 4 SIZE 10 CELLS 4 4)";
726 
727   Parser parser;
728   Result r = parser.Parse(in);
729   ASSERT_FALSE(r.IsSuccess());
730   ASSERT_EQ("12: missing height value for RUN command", r.Error());
731 }
732 
TEST_F(AmberScriptParserTest,RunDrawGridMissingCells)733 TEST_F(AmberScriptParserTest, RunDrawGridMissingCells) {
734   std::string in = R"(
735 SHADER vertex my_shader PASSTHROUGH
736 SHADER fragment my_fragment GLSL
737 # GLSL Shader
738 END
739 
740 PIPELINE graphics my_pipeline
741   ATTACH my_shader
742   ATTACH my_fragment
743 END
744 
745 RUN my_pipeline DRAW_GRID POS 2 4 SIZE 10 20)";
746 
747   Parser parser;
748   Result r = parser.Parse(in);
749   ASSERT_FALSE(r.IsSuccess());
750   ASSERT_EQ("12: invalid token in RUN command: ; expected CELLS", r.Error());
751 }
752 
TEST_F(AmberScriptParserTest,RunDrawGridMissingCellParams)753 TEST_F(AmberScriptParserTest, RunDrawGridMissingCellParams) {
754   std::string in = R"(
755 SHADER vertex my_shader PASSTHROUGH
756 SHADER fragment my_fragment GLSL
757 # GLSL Shader
758 END
759 
760 PIPELINE graphics my_pipeline
761   ATTACH my_shader
762   ATTACH my_fragment
763 END
764 
765 RUN my_pipeline DRAW_GRID POS 2 4 SIZE 10 20 CELLS)";
766 
767   Parser parser;
768   Result r = parser.Parse(in);
769   ASSERT_FALSE(r.IsSuccess());
770   ASSERT_EQ("12: missing columns value for RUN command", r.Error());
771 }
772 
TEST_F(AmberScriptParserTest,RunDrawGridMissingCellRows)773 TEST_F(AmberScriptParserTest, RunDrawGridMissingCellRows) {
774   std::string in = R"(
775 SHADER vertex my_shader PASSTHROUGH
776 SHADER fragment my_fragment GLSL
777 # GLSL Shader
778 END
779 
780 PIPELINE graphics my_pipeline
781   ATTACH my_shader
782   ATTACH my_fragment
783 END
784 
785 RUN my_pipeline DRAW_GRID POS 2 4 SIZE 10 20 CELLS 4)";
786 
787   Parser parser;
788   Result r = parser.Parse(in);
789   ASSERT_FALSE(r.IsSuccess());
790   ASSERT_EQ("12: missing rows value for RUN command", r.Error());
791 }
792 
TEST_F(AmberScriptParserTest,RunDrawGridInvalidSizeWidth)793 TEST_F(AmberScriptParserTest, RunDrawGridInvalidSizeWidth) {
794   std::string in = R"(
795 SHADER vertex my_shader PASSTHROUGH
796 SHADER fragment my_fragment GLSL
797 # GLSL Shader
798 END
799 
800 PIPELINE graphics my_pipeline
801   ATTACH my_shader
802   ATTACH my_fragment
803 END
804 
805 RUN my_pipeline DRAW_GRID POS 2 4 SIZE INVALID 20)";
806 
807   Parser parser;
808   Result r = parser.Parse(in);
809   ASSERT_FALSE(r.IsSuccess());
810   ASSERT_EQ("12: missing width value for RUN command", r.Error());
811 }
812 
TEST_F(AmberScriptParserTest,RunDrawGridInvalidSizeHeight)813 TEST_F(AmberScriptParserTest, RunDrawGridInvalidSizeHeight) {
814   std::string in = R"(
815 SHADER vertex my_shader PASSTHROUGH
816 SHADER fragment my_fragment GLSL
817 # GLSL Shader
818 END
819 
820 PIPELINE graphics my_pipeline
821   ATTACH my_shader
822   ATTACH my_fragment
823 END
824 
825 RUN my_pipeline DRAW_GRID POS 2 4 SIZE 10 INVALID)";
826 
827   Parser parser;
828   Result r = parser.Parse(in);
829   ASSERT_FALSE(r.IsSuccess());
830   ASSERT_EQ("12: missing height value for RUN command", r.Error());
831 }
832 
TEST_F(AmberScriptParserTest,RunDrawGridExtraCommands)833 TEST_F(AmberScriptParserTest, RunDrawGridExtraCommands) {
834   std::string in = R"(
835 SHADER vertex my_shader PASSTHROUGH
836 SHADER fragment my_fragment GLSL
837 # GLSL Shader
838 END
839 
840 PIPELINE graphics my_pipeline
841   ATTACH my_shader
842   ATTACH my_fragment
843 END
844 
845 RUN my_pipeline DRAW_GRID POS 2 4 SIZE 10 20 CELLS 4 4 EXTRA)";
846 
847   Parser parser;
848   Result r = parser.Parse(in);
849   ASSERT_FALSE(r.IsSuccess());
850   ASSERT_EQ("12: extra parameters after RUN command: EXTRA", r.Error());
851 }
852 
TEST_F(AmberScriptParserTest,RunDrawArrays)853 TEST_F(AmberScriptParserTest, RunDrawArrays) {
854   std::string in = R"(
855 SHADER vertex my_shader PASSTHROUGH
856 SHADER fragment my_fragment GLSL
857 # GLSL Shader
858 END
859 BUFFER vtex_buf DATA_TYPE vec3<float> DATA
860 1 2 3
861 4 5 6
862 7 8 9
863 END
864 
865 PIPELINE graphics my_pipeline
866   ATTACH my_shader
867   ATTACH my_fragment
868   VERTEX_DATA vtex_buf LOCATION 0
869 END
870 
871 RUN my_pipeline DRAW_ARRAY AS TRIANGLE_LIST START_IDX 1 COUNT 2)";
872 
873   Parser parser;
874   Result r = parser.Parse(in);
875   ASSERT_TRUE(r.IsSuccess()) << r.Error();
876 
877   auto script = parser.GetScript();
878   const auto& commands = script->GetCommands();
879   ASSERT_EQ(1U, commands.size());
880 
881   ASSERT_TRUE(commands[0]->IsDrawArrays());
882 
883   auto* cmd = commands[0]->AsDrawArrays();
884   EXPECT_FALSE(cmd->IsIndexed());
885   EXPECT_EQ(static_cast<uint32_t>(1U), cmd->GetInstanceCount());
886   EXPECT_EQ(static_cast<uint32_t>(0U), cmd->GetFirstInstance());
887   EXPECT_EQ(Topology::kTriangleList, cmd->GetTopology());
888   EXPECT_EQ(1U, cmd->GetFirstVertexIndex());
889   EXPECT_EQ(2U, cmd->GetVertexCount());
890 }
891 
TEST_F(AmberScriptParserTest,RunDrawArraysInstanced)892 TEST_F(AmberScriptParserTest, RunDrawArraysInstanced) {
893   std::string in = R"(
894 SHADER vertex my_shader PASSTHROUGH
895 SHADER fragment my_fragment GLSL
896 # GLSL Shader
897 END
898 BUFFER vtex_buf DATA_TYPE vec3<float> DATA
899 1 2 3
900 4 5 6
901 7 8 9
902 END
903 
904 PIPELINE graphics my_pipeline
905   ATTACH my_shader
906   ATTACH my_fragment
907   VERTEX_DATA vtex_buf LOCATION 0
908 END
909 
910 RUN my_pipeline DRAW_ARRAY AS TRIANGLE_LIST START_IDX 1 COUNT 2 START_INSTANCE 2 INSTANCE_COUNT 10)";
911 
912   Parser parser;
913   Result r = parser.Parse(in);
914   ASSERT_TRUE(r.IsSuccess()) << r.Error();
915 
916   auto script = parser.GetScript();
917   const auto& commands = script->GetCommands();
918   ASSERT_EQ(1U, commands.size());
919 
920   ASSERT_TRUE(commands[0]->IsDrawArrays());
921 
922   auto* cmd = commands[0]->AsDrawArrays();
923   EXPECT_FALSE(cmd->IsIndexed());
924   EXPECT_EQ(static_cast<uint32_t>(10U), cmd->GetInstanceCount());
925   EXPECT_EQ(static_cast<uint32_t>(2U), cmd->GetFirstInstance());
926   EXPECT_EQ(Topology::kTriangleList, cmd->GetTopology());
927   EXPECT_EQ(1U, cmd->GetFirstVertexIndex());
928   EXPECT_EQ(2U, cmd->GetVertexCount());
929 }
930 
TEST_F(AmberScriptParserTest,RunDrawArraysCountOmitted)931 TEST_F(AmberScriptParserTest, RunDrawArraysCountOmitted) {
932   std::string in = R"(
933 SHADER vertex my_shader PASSTHROUGH
934 SHADER fragment my_fragment GLSL
935 # GLSL Shader
936 END
937 BUFFER vtex_buf DATA_TYPE vec3<float> DATA
938 1 2 3
939 4 5 6
940 7 8 9
941 END
942 
943 PIPELINE graphics my_pipeline
944   ATTACH my_shader
945   ATTACH my_fragment
946   VERTEX_DATA vtex_buf LOCATION 0
947 END
948 
949 RUN my_pipeline DRAW_ARRAY AS TRIANGLE_LIST START_IDX 1)";
950 
951   Parser parser;
952   Result r = parser.Parse(in);
953   ASSERT_TRUE(r.IsSuccess()) << r.Error();
954 
955   auto script = parser.GetScript();
956   const auto& commands = script->GetCommands();
957   ASSERT_EQ(1U, commands.size());
958 
959   ASSERT_TRUE(commands[0]->IsDrawArrays());
960 
961   auto* cmd = commands[0]->AsDrawArrays();
962   EXPECT_FALSE(cmd->IsIndexed());
963   EXPECT_EQ(static_cast<uint32_t>(1U), cmd->GetInstanceCount());
964   EXPECT_EQ(static_cast<uint32_t>(0U), cmd->GetFirstInstance());
965   EXPECT_EQ(Topology::kTriangleList, cmd->GetTopology());
966   EXPECT_EQ(1U, cmd->GetFirstVertexIndex());
967   // There are 3 elements in the vertex buffer, but we start at element 1.
968   EXPECT_EQ(2U, cmd->GetVertexCount());
969 }
970 
TEST_F(AmberScriptParserTest,RunDrawArraysStartIdxAndCountOmitted)971 TEST_F(AmberScriptParserTest, RunDrawArraysStartIdxAndCountOmitted) {
972   std::string in = R"(
973 SHADER vertex my_shader PASSTHROUGH
974 SHADER fragment my_fragment GLSL
975 # GLSL Shader
976 END
977 BUFFER vtex_buf DATA_TYPE vec3<float> DATA
978 1 2 3
979 4 5 6
980 7 8 9
981 END
982 
983 PIPELINE graphics my_pipeline
984   ATTACH my_shader
985   ATTACH my_fragment
986   VERTEX_DATA vtex_buf LOCATION 0
987 END
988 
989 RUN my_pipeline DRAW_ARRAY AS TRIANGLE_LIST)";
990 
991   Parser parser;
992   Result r = parser.Parse(in);
993   ASSERT_TRUE(r.IsSuccess()) << r.Error();
994 
995   auto script = parser.GetScript();
996   const auto& commands = script->GetCommands();
997   ASSERT_EQ(1U, commands.size());
998 
999   ASSERT_TRUE(commands[0]->IsDrawArrays());
1000 
1001   auto* cmd = commands[0]->AsDrawArrays();
1002   EXPECT_FALSE(cmd->IsIndexed());
1003   EXPECT_EQ(static_cast<uint32_t>(1U), cmd->GetInstanceCount());
1004   EXPECT_EQ(static_cast<uint32_t>(0U), cmd->GetFirstInstance());
1005   EXPECT_EQ(Topology::kTriangleList, cmd->GetTopology());
1006   EXPECT_EQ(static_cast<uint32_t>(0U), cmd->GetFirstVertexIndex());
1007   // There are 3 elements in the vertex buffer.
1008   EXPECT_EQ(3U, cmd->GetVertexCount());
1009 }
1010 
TEST_F(AmberScriptParserTest,RunDrawArraysIndexed)1011 TEST_F(AmberScriptParserTest, RunDrawArraysIndexed) {
1012   std::string in = R"(
1013 SHADER vertex my_shader PASSTHROUGH
1014 SHADER fragment my_fragment GLSL
1015 # GLSL Shader
1016 END
1017 BUFFER vtex_buf DATA_TYPE vec3<float> DATA
1018 1 2 3
1019 4 5 6
1020 7 8 9
1021 END
1022 BUFFER idx_buf DATA_TYPE vec3<float> DATA
1023 9 8 7
1024 6 5 4
1025 3 2 1
1026 END
1027 
1028 PIPELINE graphics my_pipeline
1029   ATTACH my_shader
1030   ATTACH my_fragment
1031   VERTEX_DATA vtex_buf LOCATION 0
1032   INDEX_DATA idx_buf
1033 END
1034 
1035 RUN my_pipeline DRAW_ARRAY AS TRIANGLE_LIST INDEXED)";
1036 
1037   Parser parser;
1038   Result r = parser.Parse(in);
1039   ASSERT_TRUE(r.IsSuccess()) << r.Error();
1040 
1041   auto script = parser.GetScript();
1042   const auto& commands = script->GetCommands();
1043   ASSERT_EQ(1U, commands.size());
1044 
1045   ASSERT_TRUE(commands[0]->IsDrawArrays());
1046 
1047   auto* cmd = commands[0]->AsDrawArrays();
1048   EXPECT_TRUE(cmd->IsIndexed());
1049   EXPECT_EQ(static_cast<uint32_t>(1U), cmd->GetInstanceCount());
1050   EXPECT_EQ(static_cast<uint32_t>(0U), cmd->GetFirstInstance());
1051   EXPECT_EQ(Topology::kTriangleList, cmd->GetTopology());
1052   EXPECT_EQ(static_cast<uint32_t>(0U), cmd->GetFirstVertexIndex());
1053   // There are 3 elements in the vertex buffer.
1054   EXPECT_EQ(3U, cmd->GetVertexCount());
1055 }
1056 
TEST_F(AmberScriptParserTest,RunDrawArraysIndexedMissingIndexData)1057 TEST_F(AmberScriptParserTest, RunDrawArraysIndexedMissingIndexData) {
1058   std::string in = R"(
1059 SHADER vertex my_shader PASSTHROUGH
1060 SHADER fragment my_fragment GLSL
1061 # GLSL Shader
1062 END
1063 BUFFER vtex_buf DATA_TYPE vec3<float> DATA
1064 1 2 3
1065 4 5 6
1066 7 8 9
1067 END
1068 
1069 PIPELINE graphics my_pipeline
1070   ATTACH my_shader
1071   ATTACH my_fragment
1072   VERTEX_DATA vtex_buf LOCATION 0
1073 END
1074 
1075 RUN my_pipeline DRAW_ARRAY AS TRIANGLE_LIST INDEXED)";
1076 
1077   Parser parser;
1078   Result r = parser.Parse(in);
1079   ASSERT_FALSE(r.IsSuccess());
1080 
1081   EXPECT_EQ("18: RUN DRAW_ARRAYS INDEXED requires attached index buffer",
1082             r.Error());
1083 }
1084 
TEST_F(AmberScriptParserTest,RunDrawArraysMissingVertexBuffer)1085 TEST_F(AmberScriptParserTest, RunDrawArraysMissingVertexBuffer) {
1086   std::string in = R"(
1087 SHADER vertex my_shader PASSTHROUGH
1088 SHADER fragment my_fragment GLSL
1089 # GLSL Shader
1090 END
1091 
1092 PIPELINE graphics my_pipeline
1093   ATTACH my_shader
1094   ATTACH my_fragment
1095 END
1096 
1097 RUN my_pipeline DRAW_ARRAY TRIANGLE_LIST START_IDX 1 COUNT 2)";
1098 
1099   Parser parser;
1100   Result r = parser.Parse(in);
1101   ASSERT_FALSE(r.IsSuccess());
1102   EXPECT_EQ("12: RUN DRAW_ARRAY requires attached vertex buffer", r.Error());
1103 }
1104 
TEST_F(AmberScriptParserTest,RunDrawArraysMissingAS)1105 TEST_F(AmberScriptParserTest, RunDrawArraysMissingAS) {
1106   std::string in = R"(
1107 SHADER vertex my_shader PASSTHROUGH
1108 SHADER fragment my_fragment GLSL
1109 # GLSL Shader
1110 END
1111 BUFFER vtex_buf DATA_TYPE vec3<float> DATA
1112 1 2 3
1113 4 5 6
1114 7 8 9
1115 END
1116 
1117 PIPELINE graphics my_pipeline
1118   ATTACH my_shader
1119   ATTACH my_fragment
1120   VERTEX_DATA vtex_buf LOCATION 0
1121 END
1122 
1123 RUN my_pipeline DRAW_ARRAY TRIANGLE_LIST START_IDX 1 COUNT 2)";
1124 
1125   Parser parser;
1126   Result r = parser.Parse(in);
1127   ASSERT_FALSE(r.IsSuccess());
1128   EXPECT_EQ("18: missing AS for RUN command", r.Error());
1129 }
1130 
TEST_F(AmberScriptParserTest,RunDrawArraysMissingTopology)1131 TEST_F(AmberScriptParserTest, RunDrawArraysMissingTopology) {
1132   std::string in = R"(
1133 SHADER vertex my_shader PASSTHROUGH
1134 SHADER fragment my_fragment GLSL
1135 # GLSL Shader
1136 END
1137 BUFFER vtex_buf DATA_TYPE vec3<float> DATA
1138 1 2 3
1139 4 5 6
1140 7 8 9
1141 END
1142 
1143 PIPELINE graphics my_pipeline
1144   ATTACH my_shader
1145   ATTACH my_fragment
1146   VERTEX_DATA vtex_buf LOCATION 0
1147 END
1148 
1149 RUN my_pipeline DRAW_ARRAY AS START_IDX 1 COUNT 2)";
1150 
1151   Parser parser;
1152   Result r = parser.Parse(in);
1153   ASSERT_FALSE(r.IsSuccess());
1154   EXPECT_EQ("18: invalid topology for RUN command: START_IDX", r.Error());
1155 }
1156 
TEST_F(AmberScriptParserTest,RunDrawArraysInvalidTopologyFormat)1157 TEST_F(AmberScriptParserTest, RunDrawArraysInvalidTopologyFormat) {
1158   std::string in = R"(
1159 SHADER vertex my_shader PASSTHROUGH
1160 SHADER fragment my_fragment GLSL
1161 # GLSL Shader
1162 END
1163 BUFFER vtex_buf DATA_TYPE vec3<float> DATA
1164 1 2 3
1165 4 5 6
1166 7 8 9
1167 END
1168 
1169 PIPELINE graphics my_pipeline
1170   ATTACH my_shader
1171   ATTACH my_fragment
1172   VERTEX_DATA vtex_buf LOCATION 0
1173 END
1174 
1175 RUN my_pipeline DRAW_ARRAY AS 1234 START_IDX 1 COUNT 2)";
1176 
1177   Parser parser;
1178   Result r = parser.Parse(in);
1179   ASSERT_FALSE(r.IsSuccess());
1180   EXPECT_EQ("18: invalid topology for RUN command: 1234", r.Error());
1181 }
1182 
TEST_F(AmberScriptParserTest,RunDrawArraysInvalidTopology)1183 TEST_F(AmberScriptParserTest, RunDrawArraysInvalidTopology) {
1184   std::string in = R"(
1185 SHADER vertex my_shader PASSTHROUGH
1186 SHADER fragment my_fragment GLSL
1187 # GLSL Shader
1188 END
1189 BUFFER vtex_buf DATA_TYPE vec3<float> DATA
1190 1 2 3
1191 4 5 6
1192 7 8 9
1193 END
1194 
1195 PIPELINE graphics my_pipeline
1196   ATTACH my_shader
1197   ATTACH my_fragment
1198   VERTEX_DATA vtex_buf LOCATION 0
1199 END
1200 
1201 RUN my_pipeline DRAW_ARRAY AS INVALID_TOPOLOGY START_IDX 1 COUNT 2)";
1202 
1203   Parser parser;
1204   Result r = parser.Parse(in);
1205   ASSERT_FALSE(r.IsSuccess());
1206   EXPECT_EQ("18: invalid topology for RUN command: INVALID_TOPOLOGY",
1207             r.Error());
1208 }
1209 
TEST_F(AmberScriptParserTest,RunDrawArraysMissingStartIdx)1210 TEST_F(AmberScriptParserTest, RunDrawArraysMissingStartIdx) {
1211   std::string in = R"(
1212 SHADER vertex my_shader PASSTHROUGH
1213 SHADER fragment my_fragment GLSL
1214 # GLSL Shader
1215 END
1216 BUFFER vtex_buf DATA_TYPE vec3<float> DATA
1217 1 2 3
1218 4 5 6
1219 7 8 9
1220 END
1221 
1222 PIPELINE graphics my_pipeline
1223   ATTACH my_shader
1224   ATTACH my_fragment
1225   VERTEX_DATA vtex_buf LOCATION 0
1226 END
1227 
1228 RUN my_pipeline DRAW_ARRAY AS TRIANGLE_LIST 1 COUNT 2)";
1229 
1230   Parser parser;
1231   Result r = parser.Parse(in);
1232   ASSERT_FALSE(r.IsSuccess());
1233   EXPECT_EQ("18: expecting identifier for RUN command", r.Error());
1234 }
1235 
TEST_F(AmberScriptParserTest,RunDrawArraysMissingStartIdxValue)1236 TEST_F(AmberScriptParserTest, RunDrawArraysMissingStartIdxValue) {
1237   std::string in = R"(
1238 SHADER vertex my_shader PASSTHROUGH
1239 SHADER fragment my_fragment GLSL
1240 # GLSL Shader
1241 END
1242 BUFFER vtex_buf DATA_TYPE vec3<float> DATA
1243 1 2 3
1244 4 5 6
1245 7 8 9
1246 END
1247 
1248 PIPELINE graphics my_pipeline
1249   ATTACH my_shader
1250   ATTACH my_fragment
1251   VERTEX_DATA vtex_buf LOCATION 0
1252 END
1253 
1254 RUN my_pipeline DRAW_ARRAY AS TRIANGLE_LIST START_IDX COUNT 2)";
1255 
1256   Parser parser;
1257   Result r = parser.Parse(in);
1258   ASSERT_FALSE(r.IsSuccess());
1259   EXPECT_EQ("18: invalid START_IDX value for RUN command: COUNT", r.Error());
1260 }
1261 
TEST_F(AmberScriptParserTest,RunDrawArraysInvalidStartIdxValueFormat)1262 TEST_F(AmberScriptParserTest, RunDrawArraysInvalidStartIdxValueFormat) {
1263   std::string in = R"(
1264 SHADER vertex my_shader PASSTHROUGH
1265 SHADER fragment my_fragment GLSL
1266 # GLSL Shader
1267 END
1268 BUFFER vtex_buf DATA_TYPE vec3<float> DATA
1269 1 2 3
1270 4 5 6
1271 7 8 9
1272 END
1273 
1274 PIPELINE graphics my_pipeline
1275   ATTACH my_shader
1276   ATTACH my_fragment
1277   VERTEX_DATA vtex_buf LOCATION 0
1278 END
1279 
1280 RUN my_pipeline DRAW_ARRAY AS TRIANGLE_LIST START_IDX INVALID COUNT 2)";
1281 
1282   Parser parser;
1283   Result r = parser.Parse(in);
1284   ASSERT_FALSE(r.IsSuccess());
1285   EXPECT_EQ("18: invalid START_IDX value for RUN command: INVALID", r.Error());
1286 }
1287 
TEST_F(AmberScriptParserTest,RunDrawArraysInvalidStartIdxValue)1288 TEST_F(AmberScriptParserTest, RunDrawArraysInvalidStartIdxValue) {
1289   std::string in = R"(
1290 SHADER vertex my_shader PASSTHROUGH
1291 SHADER fragment my_fragment GLSL
1292 # GLSL Shader
1293 END
1294 BUFFER vtex_buf DATA_TYPE vec3<float> DATA
1295 1 2 3
1296 4 5 6
1297 7 8 9
1298 END
1299 
1300 PIPELINE graphics my_pipeline
1301   ATTACH my_shader
1302   ATTACH my_fragment
1303   VERTEX_DATA vtex_buf LOCATION 0
1304 END
1305 
1306 RUN my_pipeline DRAW_ARRAY AS TRIANGLE_LIST START_IDX 1.3 COUNT 2)";
1307 
1308   Parser parser;
1309   Result r = parser.Parse(in);
1310   ASSERT_FALSE(r.IsSuccess());
1311   EXPECT_EQ("18: invalid START_IDX value for RUN command: 1.3", r.Error());
1312 }
1313 
TEST_F(AmberScriptParserTest,RunDrawArraysNegativeStartIdxValue)1314 TEST_F(AmberScriptParserTest, RunDrawArraysNegativeStartIdxValue) {
1315   std::string in = R"(
1316 SHADER vertex my_shader PASSTHROUGH
1317 SHADER fragment my_fragment GLSL
1318 # GLSL Shader
1319 END
1320 BUFFER vtex_buf DATA_TYPE vec3<float> DATA
1321 1 2 3
1322 4 5 6
1323 7 8 9
1324 END
1325 
1326 PIPELINE graphics my_pipeline
1327   ATTACH my_shader
1328   ATTACH my_fragment
1329   VERTEX_DATA vtex_buf LOCATION 0
1330 END
1331 
1332 RUN my_pipeline DRAW_ARRAY AS TRIANGLE_LIST START_IDX -1 COUNT 2)";
1333 
1334   Parser parser;
1335   Result r = parser.Parse(in);
1336   ASSERT_FALSE(r.IsSuccess());
1337   EXPECT_EQ("18: START_IDX value must be >= 0 for RUN command", r.Error());
1338 }
1339 
TEST_F(AmberScriptParserTest,RunDrawArraysMissingStartInstanceValue)1340 TEST_F(AmberScriptParserTest, RunDrawArraysMissingStartInstanceValue) {
1341   std::string in = R"(
1342 SHADER vertex my_shader PASSTHROUGH
1343 SHADER fragment my_fragment GLSL
1344 # GLSL Shader
1345 END
1346 BUFFER vtex_buf DATA_TYPE vec3<float> DATA
1347 1 2 3
1348 4 5 6
1349 7 8 9
1350 END
1351 
1352 PIPELINE graphics my_pipeline
1353   ATTACH my_shader
1354   ATTACH my_fragment
1355   VERTEX_DATA vtex_buf LOCATION 0
1356 END
1357 
1358 RUN my_pipeline DRAW_ARRAY AS TRIANGLE_LIST START_IDX 0 COUNT 2 START_INSTANCE INSTANCE_COUNT)";
1359 
1360   Parser parser;
1361   Result r = parser.Parse(in);
1362   ASSERT_FALSE(r.IsSuccess());
1363   EXPECT_EQ("18: invalid START_INSTANCE value for RUN command: INSTANCE_COUNT",
1364             r.Error());
1365 }
1366 
TEST_F(AmberScriptParserTest,RunDrawArraysInvalidStartInstanceValueFormat)1367 TEST_F(AmberScriptParserTest, RunDrawArraysInvalidStartInstanceValueFormat) {
1368   std::string in = R"(
1369 SHADER vertex my_shader PASSTHROUGH
1370 SHADER fragment my_fragment GLSL
1371 # GLSL Shader
1372 END
1373 BUFFER vtex_buf DATA_TYPE vec3<float> DATA
1374 1 2 3
1375 4 5 6
1376 7 8 9
1377 END
1378 
1379 PIPELINE graphics my_pipeline
1380   ATTACH my_shader
1381   ATTACH my_fragment
1382   VERTEX_DATA vtex_buf LOCATION 0
1383 END
1384 
1385 RUN my_pipeline DRAW_ARRAY AS TRIANGLE_LIST START_IDX 0 COUNT 2 START_INSTANCE INVALID INSTANCE_COUNT 4)";
1386 
1387   Parser parser;
1388   Result r = parser.Parse(in);
1389   ASSERT_FALSE(r.IsSuccess());
1390   EXPECT_EQ("18: invalid START_INSTANCE value for RUN command: INVALID",
1391             r.Error());
1392 }
1393 
TEST_F(AmberScriptParserTest,RunDrawArraysInvalidStartInstanceValue)1394 TEST_F(AmberScriptParserTest, RunDrawArraysInvalidStartInstanceValue) {
1395   std::string in = R"(
1396 SHADER vertex my_shader PASSTHROUGH
1397 SHADER fragment my_fragment GLSL
1398 # GLSL Shader
1399 END
1400 BUFFER vtex_buf DATA_TYPE vec3<float> DATA
1401 1 2 3
1402 4 5 6
1403 7 8 9
1404 END
1405 
1406 PIPELINE graphics my_pipeline
1407   ATTACH my_shader
1408   ATTACH my_fragment
1409   VERTEX_DATA vtex_buf LOCATION 0
1410 END
1411 
1412 RUN my_pipeline DRAW_ARRAY AS TRIANGLE_LIST START_IDX 0 COUNT 2 START_INSTANCE 1.3 INSTANCE_COUNT 5)";
1413 
1414   Parser parser;
1415   Result r = parser.Parse(in);
1416   ASSERT_FALSE(r.IsSuccess());
1417   EXPECT_EQ("18: invalid START_INSTANCE value for RUN command: 1.3", r.Error());
1418 }
1419 
TEST_F(AmberScriptParserTest,RunDrawArraysNegativeStartInstanceValue)1420 TEST_F(AmberScriptParserTest, RunDrawArraysNegativeStartInstanceValue) {
1421   std::string in = R"(
1422 SHADER vertex my_shader PASSTHROUGH
1423 SHADER fragment my_fragment GLSL
1424 # GLSL Shader
1425 END
1426 BUFFER vtex_buf DATA_TYPE vec3<float> DATA
1427 1 2 3
1428 4 5 6
1429 7 8 9
1430 END
1431 
1432 PIPELINE graphics my_pipeline
1433   ATTACH my_shader
1434   ATTACH my_fragment
1435   VERTEX_DATA vtex_buf LOCATION 0
1436 END
1437 
1438 RUN my_pipeline DRAW_ARRAY AS TRIANGLE_LIST START_IDX 0 COUNT 2 START_INSTANCE -1 INSTANCE_COUNT 2)";
1439 
1440   Parser parser;
1441   Result r = parser.Parse(in);
1442   ASSERT_FALSE(r.IsSuccess());
1443   EXPECT_EQ("18: START_INSTANCE value must be >= 0 for RUN command", r.Error());
1444 }
1445 
TEST_F(AmberScriptParserTest,RunDrawArraysMissingCount)1446 TEST_F(AmberScriptParserTest, RunDrawArraysMissingCount) {
1447   std::string in = R"(
1448 SHADER vertex my_shader PASSTHROUGH
1449 SHADER fragment my_fragment GLSL
1450 # GLSL Shader
1451 END
1452 BUFFER vtex_buf DATA_TYPE vec3<float> DATA
1453 1 2 3
1454 4 5 6
1455 7 8 9
1456 END
1457 
1458 PIPELINE graphics my_pipeline
1459   ATTACH my_shader
1460   ATTACH my_fragment
1461   VERTEX_DATA vtex_buf LOCATION 0
1462 END
1463 
1464 RUN my_pipeline DRAW_ARRAY AS TRIANGLE_LIST START_IDX 1 2)";
1465 
1466   Parser parser;
1467   Result r = parser.Parse(in);
1468   ASSERT_FALSE(r.IsSuccess());
1469   EXPECT_EQ("18: expecting identifier for RUN command", r.Error());
1470 }
1471 
TEST_F(AmberScriptParserTest,RunDrawArraysMissingCountValue)1472 TEST_F(AmberScriptParserTest, RunDrawArraysMissingCountValue) {
1473   std::string in = R"(
1474 SHADER vertex my_shader PASSTHROUGH
1475 SHADER fragment my_fragment GLSL
1476 # GLSL Shader
1477 END
1478 BUFFER vtex_buf DATA_TYPE vec3<float> DATA
1479 1 2 3
1480 4 5 6
1481 7 8 9
1482 END
1483 
1484 PIPELINE graphics my_pipeline
1485   ATTACH my_shader
1486   ATTACH my_fragment
1487   VERTEX_DATA vtex_buf LOCATION 0
1488 END
1489 
1490 RUN my_pipeline DRAW_ARRAY AS TRIANGLE_LIST START_IDX 1 COUNT)";
1491 
1492   Parser parser;
1493   Result r = parser.Parse(in);
1494   ASSERT_FALSE(r.IsSuccess());
1495   EXPECT_EQ("18: invalid COUNT value for RUN command: ", r.Error());
1496 }
1497 
TEST_F(AmberScriptParserTest,RunDrawArraysStartIdxTooLarge)1498 TEST_F(AmberScriptParserTest, RunDrawArraysStartIdxTooLarge) {
1499   std::string in = R"(
1500 SHADER vertex my_shader PASSTHROUGH
1501 SHADER fragment my_fragment GLSL
1502 # GLSL Shader
1503 END
1504 BUFFER vtex_buf DATA_TYPE vec3<float> DATA
1505 1 2 3
1506 4 5 6
1507 7 8 9
1508 END
1509 
1510 PIPELINE graphics my_pipeline
1511   ATTACH my_shader
1512   ATTACH my_fragment
1513   VERTEX_DATA vtex_buf LOCATION 0
1514 END
1515 
1516 RUN my_pipeline DRAW_ARRAY AS TRIANGLE_LIST START_IDX 9 COUNT 1)";
1517 
1518   Parser parser;
1519   Result r = parser.Parse(in);
1520   ASSERT_FALSE(r.IsSuccess());
1521   EXPECT_EQ("18: START_IDX plus COUNT exceeds vertex buffer data size",
1522             r.Error());
1523 }
1524 
TEST_F(AmberScriptParserTest,RunDrawArraysCountTooLarge)1525 TEST_F(AmberScriptParserTest, RunDrawArraysCountTooLarge) {
1526   std::string in = R"(
1527 SHADER vertex my_shader PASSTHROUGH
1528 SHADER fragment my_fragment GLSL
1529 # GLSL Shader
1530 END
1531 BUFFER vtex_buf DATA_TYPE vec3<float> DATA
1532 1 2 3
1533 4 5 6
1534 7 8 9
1535 END
1536 
1537 PIPELINE graphics my_pipeline
1538   ATTACH my_shader
1539   ATTACH my_fragment
1540   VERTEX_DATA vtex_buf LOCATION 0
1541 END
1542 
1543 RUN my_pipeline DRAW_ARRAY AS TRIANGLE_LIST START_IDX 1 COUNT 9)";
1544 
1545   Parser parser;
1546   Result r = parser.Parse(in);
1547   ASSERT_FALSE(r.IsSuccess());
1548   EXPECT_EQ("18: START_IDX plus COUNT exceeds vertex buffer data size",
1549             r.Error());
1550 }
1551 
TEST_F(AmberScriptParserTest,RunDrawArraysIndexedStartIdxTooLarge)1552 TEST_F(AmberScriptParserTest, RunDrawArraysIndexedStartIdxTooLarge) {
1553   std::string in = R"(
1554 SHADER vertex my_shader PASSTHROUGH
1555 SHADER fragment my_fragment GLSL
1556 # GLSL Shader
1557 END
1558 BUFFER vtex_buf DATA_TYPE vec3<float> DATA
1559 1 2 3
1560 END
1561 BUFFER indices DATA_TYPE int32 DATA
1562 0 1 2 1 2 0
1563 END
1564 
1565 PIPELINE graphics my_pipeline
1566   ATTACH my_shader
1567   ATTACH my_fragment
1568   VERTEX_DATA vtex_buf LOCATION 0
1569   INDEX_DATA indices
1570 END
1571 
1572 RUN my_pipeline DRAW_ARRAY AS TRIANGLE_LIST INDEXED START_IDX 6 COUNT 1)";
1573 
1574   Parser parser;
1575   Result r = parser.Parse(in);
1576   ASSERT_FALSE(r.IsSuccess());
1577   EXPECT_EQ("20: START_IDX plus COUNT exceeds index buffer data size",
1578             r.Error());
1579 }
1580 
TEST_F(AmberScriptParserTest,RunDrawArraysIndexedCountTooLarge)1581 TEST_F(AmberScriptParserTest, RunDrawArraysIndexedCountTooLarge) {
1582   std::string in = R"(
1583 SHADER vertex my_shader PASSTHROUGH
1584 SHADER fragment my_fragment GLSL
1585 # GLSL Shader
1586 END
1587 BUFFER vtex_buf DATA_TYPE vec3<float> DATA
1588 1 2 3
1589 END
1590 BUFFER indices DATA_TYPE int32 DATA
1591 0 1 2 1 2 0
1592 END
1593 
1594 PIPELINE graphics my_pipeline
1595   ATTACH my_shader
1596   ATTACH my_fragment
1597   VERTEX_DATA vtex_buf LOCATION 0
1598   INDEX_DATA indices
1599 END
1600 
1601 RUN my_pipeline DRAW_ARRAY AS TRIANGLE_LIST INDEXED START_IDX 1 COUNT 6)";
1602 
1603   Parser parser;
1604   Result r = parser.Parse(in);
1605   ASSERT_FALSE(r.IsSuccess());
1606   EXPECT_EQ("20: START_IDX plus COUNT exceeds index buffer data size",
1607             r.Error());
1608 }
1609 
TEST_F(AmberScriptParserTest,RunDrawArraysInvalidCountValueFormat)1610 TEST_F(AmberScriptParserTest, RunDrawArraysInvalidCountValueFormat) {
1611   std::string in = R"(
1612 SHADER vertex my_shader PASSTHROUGH
1613 SHADER fragment my_fragment GLSL
1614 # GLSL Shader
1615 END
1616 BUFFER vtex_buf DATA_TYPE vec3<float> DATA
1617 1 2 3
1618 4 5 6
1619 7 8 9
1620 END
1621 
1622 PIPELINE graphics my_pipeline
1623   ATTACH my_shader
1624   ATTACH my_fragment
1625   VERTEX_DATA vtex_buf LOCATION 0
1626 END
1627 
1628 RUN my_pipeline DRAW_ARRAY AS TRIANGLE_LIST START_IDX 1 COUNT INVALID)";
1629 
1630   Parser parser;
1631   Result r = parser.Parse(in);
1632   ASSERT_FALSE(r.IsSuccess());
1633   EXPECT_EQ("18: invalid COUNT value for RUN command: INVALID", r.Error());
1634 }
1635 
TEST_F(AmberScriptParserTest,RunDrawArraysInvalidCountValue)1636 TEST_F(AmberScriptParserTest, RunDrawArraysInvalidCountValue) {
1637   std::string in = R"(
1638 SHADER vertex my_shader PASSTHROUGH
1639 SHADER fragment my_fragment GLSL
1640 # GLSL Shader
1641 END
1642 BUFFER vtex_buf DATA_TYPE vec3<float> DATA
1643 1 2 3
1644 4 5 6
1645 7 8 9
1646 END
1647 
1648 PIPELINE graphics my_pipeline
1649   ATTACH my_shader
1650   ATTACH my_fragment
1651   VERTEX_DATA vtex_buf LOCATION 0
1652 END
1653 
1654 RUN my_pipeline DRAW_ARRAY AS TRIANGLE_LIST START_IDX 1 COUNT 2.4)";
1655 
1656   Parser parser;
1657   Result r = parser.Parse(in);
1658   ASSERT_FALSE(r.IsSuccess());
1659   EXPECT_EQ("18: invalid COUNT value for RUN command: 2.4", r.Error());
1660 }
1661 
TEST_F(AmberScriptParserTest,RunDrawArraysNegativeCountValue)1662 TEST_F(AmberScriptParserTest, RunDrawArraysNegativeCountValue) {
1663   std::string in = R"(
1664 SHADER vertex my_shader PASSTHROUGH
1665 SHADER fragment my_fragment GLSL
1666 # GLSL Shader
1667 END
1668 BUFFER vtex_buf DATA_TYPE vec3<float> DATA
1669 1 2 3
1670 4 5 6
1671 7 8 9
1672 END
1673 
1674 PIPELINE graphics my_pipeline
1675   ATTACH my_shader
1676   ATTACH my_fragment
1677   VERTEX_DATA vtex_buf LOCATION 0
1678 END
1679 
1680 RUN my_pipeline DRAW_ARRAY AS TRIANGLE_LIST START_IDX 1 COUNT -2)";
1681 
1682   Parser parser;
1683   Result r = parser.Parse(in);
1684   ASSERT_FALSE(r.IsSuccess());
1685   EXPECT_EQ("18: COUNT value must be > 0 for RUN command", r.Error());
1686 }
1687 
TEST_F(AmberScriptParserTest,RunDrawArraysZeroCountValue)1688 TEST_F(AmberScriptParserTest, RunDrawArraysZeroCountValue) {
1689   std::string in = R"(
1690 SHADER vertex my_shader PASSTHROUGH
1691 SHADER fragment my_fragment GLSL
1692 # GLSL Shader
1693 END
1694 BUFFER vtex_buf DATA_TYPE vec3<float> DATA
1695 1 2 3
1696 4 5 6
1697 7 8 9
1698 END
1699 
1700 PIPELINE graphics my_pipeline
1701   ATTACH my_shader
1702   ATTACH my_fragment
1703   VERTEX_DATA vtex_buf LOCATION 0
1704 END
1705 
1706 RUN my_pipeline DRAW_ARRAY AS TRIANGLE_LIST START_IDX 1 COUNT 0)";
1707 
1708   Parser parser;
1709   Result r = parser.Parse(in);
1710   ASSERT_FALSE(r.IsSuccess());
1711   EXPECT_EQ("18: COUNT value must be > 0 for RUN command", r.Error());
1712 }
1713 
TEST_F(AmberScriptParserTest,RunDrawArraysMissingInstanceCountValue)1714 TEST_F(AmberScriptParserTest, RunDrawArraysMissingInstanceCountValue) {
1715   std::string in = R"(
1716 SHADER vertex my_shader PASSTHROUGH
1717 SHADER fragment my_fragment GLSL
1718 # GLSL Shader
1719 END
1720 BUFFER vtex_buf DATA_TYPE vec3<float> DATA
1721 1 2 3
1722 4 5 6
1723 7 8 9
1724 END
1725 
1726 PIPELINE graphics my_pipeline
1727   ATTACH my_shader
1728   ATTACH my_fragment
1729   VERTEX_DATA vtex_buf LOCATION 0
1730 END
1731 
1732 RUN my_pipeline DRAW_ARRAY AS TRIANGLE_LIST START_IDX 1 COUNT 2 START_INSTANCE 0 INSTANCE_COUNT)";
1733 
1734   Parser parser;
1735   Result r = parser.Parse(in);
1736   ASSERT_FALSE(r.IsSuccess());
1737   EXPECT_EQ("18: invalid INSTANCE_COUNT value for RUN command: ", r.Error());
1738 }
1739 
TEST_F(AmberScriptParserTest,RunDrawArraysInvalidInstanceCountValueFormat)1740 TEST_F(AmberScriptParserTest, RunDrawArraysInvalidInstanceCountValueFormat) {
1741   std::string in = R"(
1742 SHADER vertex my_shader PASSTHROUGH
1743 SHADER fragment my_fragment GLSL
1744 # GLSL Shader
1745 END
1746 BUFFER vtex_buf DATA_TYPE vec3<float> DATA
1747 1 2 3
1748 4 5 6
1749 7 8 9
1750 END
1751 
1752 PIPELINE graphics my_pipeline
1753   ATTACH my_shader
1754   ATTACH my_fragment
1755   VERTEX_DATA vtex_buf LOCATION 0
1756 END
1757 
1758 RUN my_pipeline DRAW_ARRAY AS TRIANGLE_LIST START_IDX 1 COUNT 2 START_INSTANCE 0 INSTANCE_COUNT INVALID)";
1759 
1760   Parser parser;
1761   Result r = parser.Parse(in);
1762   ASSERT_FALSE(r.IsSuccess());
1763   EXPECT_EQ("18: invalid INSTANCE_COUNT value for RUN command: INVALID",
1764             r.Error());
1765 }
1766 
TEST_F(AmberScriptParserTest,RunDrawArraysInvalidInstanceCountValue)1767 TEST_F(AmberScriptParserTest, RunDrawArraysInvalidInstanceCountValue) {
1768   std::string in = R"(
1769 SHADER vertex my_shader PASSTHROUGH
1770 SHADER fragment my_fragment GLSL
1771 # GLSL Shader
1772 END
1773 BUFFER vtex_buf DATA_TYPE vec3<float> DATA
1774 1 2 3
1775 4 5 6
1776 7 8 9
1777 END
1778 
1779 PIPELINE graphics my_pipeline
1780   ATTACH my_shader
1781   ATTACH my_fragment
1782   VERTEX_DATA vtex_buf LOCATION 0
1783 END
1784 
1785 RUN my_pipeline DRAW_ARRAY AS TRIANGLE_LIST START_IDX 1 COUNT 2 START_INSTANCE 0 INSTANCE_COUNT 2.4)";
1786 
1787   Parser parser;
1788   Result r = parser.Parse(in);
1789   ASSERT_FALSE(r.IsSuccess());
1790   EXPECT_EQ("18: invalid INSTANCE_COUNT value for RUN command: 2.4", r.Error());
1791 }
1792 
TEST_F(AmberScriptParserTest,RunDrawArraysNegativeInstanceCountValue)1793 TEST_F(AmberScriptParserTest, RunDrawArraysNegativeInstanceCountValue) {
1794   std::string in = R"(
1795 SHADER vertex my_shader PASSTHROUGH
1796 SHADER fragment my_fragment GLSL
1797 # GLSL Shader
1798 END
1799 BUFFER vtex_buf DATA_TYPE vec3<float> DATA
1800 1 2 3
1801 4 5 6
1802 7 8 9
1803 END
1804 
1805 PIPELINE graphics my_pipeline
1806   ATTACH my_shader
1807   ATTACH my_fragment
1808   VERTEX_DATA vtex_buf LOCATION 0
1809 END
1810 
1811 RUN my_pipeline DRAW_ARRAY AS TRIANGLE_LIST START_IDX 1 COUNT 2 START_INSTANCE 0 INSTANCE_COUNT -2)";
1812 
1813   Parser parser;
1814   Result r = parser.Parse(in);
1815   ASSERT_FALSE(r.IsSuccess());
1816   EXPECT_EQ("18: INSTANCE_COUNT value must be > 0 for RUN command", r.Error());
1817 }
1818 
TEST_F(AmberScriptParserTest,RunDrawArraysZeroInstanceCountValue)1819 TEST_F(AmberScriptParserTest, RunDrawArraysZeroInstanceCountValue) {
1820   std::string in = R"(
1821 SHADER vertex my_shader PASSTHROUGH
1822 SHADER fragment my_fragment GLSL
1823 # GLSL Shader
1824 END
1825 BUFFER vtex_buf DATA_TYPE vec3<float> DATA
1826 1 2 3
1827 4 5 6
1828 7 8 9
1829 END
1830 
1831 PIPELINE graphics my_pipeline
1832   ATTACH my_shader
1833   ATTACH my_fragment
1834   VERTEX_DATA vtex_buf LOCATION 0
1835 END
1836 
1837 RUN my_pipeline DRAW_ARRAY AS TRIANGLE_LIST START_IDX 1 COUNT 2 START_INSTANCE 0 INSTANCE_COUNT 0)";
1838 
1839   Parser parser;
1840   Result r = parser.Parse(in);
1841   ASSERT_FALSE(r.IsSuccess());
1842   EXPECT_EQ("18: INSTANCE_COUNT value must be > 0 for RUN command", r.Error());
1843 }
1844 
1845 }  // namespace amberscript
1846 }  // namespace amber
1847