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