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