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