• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2019 The Amber Authors.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //     http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or parseried.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 #include "gtest/gtest.h"
16 #include "src/amberscript/parser.h"
17 
18 namespace amber {
19 namespace amberscript {
20 
21 using AmberScriptParserTest = testing::Test;
22 
TEST_F(AmberScriptParserTest,BindColorBuffer)23 TEST_F(AmberScriptParserTest, BindColorBuffer) {
24   std::string in = R"(
25 SHADER vertex my_shader PASSTHROUGH
26 SHADER fragment my_fragment GLSL
27 # GLSL Shader
28 END
29 BUFFER my_fb FORMAT R32G32B32A32_SFLOAT
30 
31 PIPELINE graphics my_pipeline
32   ATTACH my_shader
33   ATTACH my_fragment
34 
35   BIND BUFFER my_fb AS color LOCATION 0
36 END)";
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& pipelines = script->GetPipelines();
44   ASSERT_EQ(1U, pipelines.size());
45 
46   const auto* pipeline = pipelines[0].get();
47   const auto& color_buffers = pipeline->GetColorAttachments();
48   ASSERT_EQ(1U, color_buffers.size());
49 
50   const auto& buf_info = color_buffers[0];
51   ASSERT_TRUE(buf_info.buffer != nullptr);
52   EXPECT_EQ(0, buf_info.location);
53   EXPECT_EQ(250 * 250, buf_info.buffer->ElementCount());
54   EXPECT_EQ(250 * 250 * 4, buf_info.buffer->ValueCount());
55   EXPECT_EQ(250 * 250 * 4 * sizeof(float), buf_info.buffer->GetSizeInBytes());
56 }
57 
TEST_F(AmberScriptParserTest,BindColorBufferTwice)58 TEST_F(AmberScriptParserTest, BindColorBufferTwice) {
59   std::string in = R"(
60 SHADER vertex my_shader PASSTHROUGH
61 SHADER fragment my_fragment GLSL
62 # GLSL Shader
63 END
64 BUFFER my_fb FORMAT R32G32B32A32_SFLOAT
65 
66 PIPELINE graphics my_pipeline
67   ATTACH my_shader
68   ATTACH my_fragment
69 
70   BIND BUFFER my_fb AS color LOCATION 0
71   BIND BUFFER my_fb AS color LOCATION 1
72 END)";
73 
74   Parser parser;
75   Result r = parser.Parse(in);
76   ASSERT_FALSE(r.IsSuccess());
77   EXPECT_EQ("13: color buffer may only be bound to a PIPELINE once", r.Error());
78 }
79 
TEST_F(AmberScriptParserTest,BindColorBufferMissingBuffer)80 TEST_F(AmberScriptParserTest, BindColorBufferMissingBuffer) {
81   std::string in = R"(
82 SHADER vertex my_shader PASSTHROUGH
83 SHADER fragment my_fragment GLSL
84 # GLSL Shader
85 END
86 BUFFER my_fb FORMAT R32G32B32A32_SFLOAT
87 
88 PIPELINE graphics my_pipeline
89   ATTACH my_shader
90   ATTACH my_fragment
91 
92   BIND BUFFER AS color LOCATION 0
93 END)";
94 
95   Parser parser;
96   Result r = parser.Parse(in);
97   ASSERT_FALSE(r.IsSuccess());
98   EXPECT_EQ("12: unknown buffer: AS", r.Error());
99 }
100 
TEST_F(AmberScriptParserTest,BindColorBufferNonDeclaredBuffer)101 TEST_F(AmberScriptParserTest, BindColorBufferNonDeclaredBuffer) {
102   std::string in = R"(
103 SHADER vertex my_shader PASSTHROUGH
104 SHADER fragment my_fragment GLSL
105 # GLSL Shader
106 END
107 
108 PIPELINE graphics my_pipeline
109   ATTACH my_shader
110   ATTACH my_fragment
111 
112   BIND BUFFER my_fb AS color LOCATION 0
113 END)";
114 
115   Parser parser;
116   Result r = parser.Parse(in);
117   ASSERT_FALSE(r.IsSuccess());
118   EXPECT_EQ("11: unknown buffer: my_fb", r.Error());
119 }
120 
TEST_F(AmberScriptParserTest,BindColorBufferMissingLocation)121 TEST_F(AmberScriptParserTest, BindColorBufferMissingLocation) {
122   std::string in = R"(
123 SHADER vertex my_shader PASSTHROUGH
124 SHADER fragment my_fragment GLSL
125 # GLSL Shader
126 END
127 BUFFER my_fb FORMAT R32G32B32A32_SFLOAT
128 
129 PIPELINE graphics my_pipeline
130   ATTACH my_shader
131   ATTACH my_fragment
132 
133   BIND BUFFER my_fb AS color
134 END)";
135 
136   Parser parser;
137   Result r = parser.Parse(in);
138   ASSERT_FALSE(r.IsSuccess());
139   EXPECT_EQ("13: BIND missing LOCATION", r.Error());
140 }
141 
TEST_F(AmberScriptParserTest,BindColorBufferMissingLocationIndex)142 TEST_F(AmberScriptParserTest, BindColorBufferMissingLocationIndex) {
143   std::string in = R"(
144 SHADER vertex my_shader PASSTHROUGH
145 SHADER fragment my_fragment GLSL
146 # GLSL Shader
147 END
148 BUFFER my_fb FORMAT R32G32B32A32_SFLOAT
149 
150 PIPELINE graphics my_pipeline
151   ATTACH my_shader
152   ATTACH my_fragment
153 
154   BIND BUFFER my_fb AS color LOCATION
155 END)";
156 
157   Parser parser;
158   Result r = parser.Parse(in);
159   ASSERT_FALSE(r.IsSuccess());
160   EXPECT_EQ("13: invalid value for BIND LOCATION", r.Error());
161 }
162 
TEST_F(AmberScriptParserTest,BindColorBufferInvalidLocationIndex)163 TEST_F(AmberScriptParserTest, BindColorBufferInvalidLocationIndex) {
164   std::string in = R"(
165 SHADER vertex my_shader PASSTHROUGH
166 SHADER fragment my_fragment GLSL
167 # GLSL Shader
168 END
169 BUFFER my_fb FORMAT R32G32B32A32_SFLOAT
170 
171 PIPELINE graphics my_pipeline
172   ATTACH my_shader
173   ATTACH my_fragment
174 
175   BIND BUFFER my_fb AS color LOCATION INVALID
176 END)";
177 
178   Parser parser;
179   Result r = parser.Parse(in);
180   ASSERT_FALSE(r.IsSuccess());
181   EXPECT_EQ("12: invalid value for BIND LOCATION", r.Error());
182 }
183 
TEST_F(AmberScriptParserTest,BindColorBufferExtraParams)184 TEST_F(AmberScriptParserTest, BindColorBufferExtraParams) {
185   std::string in = R"(
186 SHADER vertex my_shader PASSTHROUGH
187 SHADER fragment my_fragment GLSL
188 # GLSL Shader
189 END
190 BUFFER my_fb FORMAT R32G32B32A32_SFLOAT
191 
192 PIPELINE graphics my_pipeline
193   ATTACH my_shader
194   ATTACH my_fragment
195 
196   BIND BUFFER my_fb AS color LOCATION 0 EXTRA
197 END)";
198 
199   Parser parser;
200   Result r = parser.Parse(in);
201   ASSERT_FALSE(r.IsSuccess());
202   EXPECT_EQ("12: extra parameters after BIND command", r.Error());
203 }
204 
TEST_F(AmberScriptParserTest,BindColorBufferDuplicateLocation)205 TEST_F(AmberScriptParserTest, BindColorBufferDuplicateLocation) {
206   std::string in = R"(
207 SHADER vertex my_shader PASSTHROUGH
208 SHADER fragment my_fragment GLSL
209 # GLSL Shader
210 END
211 BUFFER my_fb FORMAT R32G32B32A32_SFLOAT
212 BUFFER sec_fb FORMAT R32G32B32A32_SFLOAT
213 
214 PIPELINE graphics my_pipeline
215   ATTACH my_shader
216   ATTACH my_fragment
217 
218   BIND BUFFER my_fb AS color LOCATION 0
219   BIND BUFFER sec_fb AS color LOCATION 0
220 END)";
221 
222   Parser parser;
223   Result r = parser.Parse(in);
224   ASSERT_FALSE(r.IsSuccess());
225   EXPECT_EQ("14: can not bind two color buffers to the same LOCATION",
226             r.Error());
227 }
228 
TEST_F(AmberScriptParserTest,BindColorToTwoPipelinesRequiresMatchingSize)229 TEST_F(AmberScriptParserTest, BindColorToTwoPipelinesRequiresMatchingSize) {
230   std::string in = R"(
231 SHADER vertex my_shader PASSTHROUGH
232 SHADER fragment my_fragment GLSL
233 # GLSL Shader
234 END
235 BUFFER my_fb FORMAT R32G32B32A32_SFLOAT
236 
237 PIPELINE graphics my_pipeline
238   ATTACH my_shader
239   ATTACH my_fragment
240 
241   BIND BUFFER my_fb AS color LOCATION 0
242 END
243 PIPELINE graphics second_pipeline
244   ATTACH my_shader
245   ATTACH my_fragment
246 
247   BIND BUFFER my_fb AS color LOCATION 0
248   FRAMEBUFFER_SIZE 256 300
249 END)";
250 
251   Parser parser;
252   Result r = parser.Parse(in);
253   ASSERT_FALSE(r.IsSuccess());
254   EXPECT_EQ("shared framebuffer must have same size over all PIPELINES",
255             r.Error());
256 }
257 
TEST_F(AmberScriptParserTest,BindColorTwoPipelines)258 TEST_F(AmberScriptParserTest, BindColorTwoPipelines) {
259   std::string in = R"(
260 SHADER vertex my_shader PASSTHROUGH
261 SHADER fragment my_fragment GLSL
262 # GLSL Shader
263 END
264 BUFFER my_fb FORMAT R32G32B32A32_SFLOAT
265 BUFFER second_fb FORMAT R8G8B8A8_UINT
266 BUFFER depth_1 FORMAT D32_SFLOAT_S8_UINT
267 BUFFER depth_2 FORMAT D32_SFLOAT_S8_UINT
268 
269 PIPELINE graphics my_pipeline
270   ATTACH my_shader
271   ATTACH my_fragment
272 
273   BIND BUFFER my_fb AS color LOCATION 0
274   BIND BUFFER depth_1 AS depth_stencil
275   FRAMEBUFFER_SIZE 90 180
276 END
277 PIPELINE graphics second_pipeline
278   ATTACH my_shader
279   ATTACH my_fragment
280 
281   BIND BUFFER second_fb AS color LOCATION 9
282   BIND BUFFER depth_2 AS depth_stencil
283   FRAMEBUFFER_SIZE 256 300
284 END)";
285 
286   Parser parser;
287   Result r = parser.Parse(in);
288   ASSERT_TRUE(r.IsSuccess()) << r.Error();
289 
290   auto script = parser.GetScript();
291   const auto& pipelines = script->GetPipelines();
292   ASSERT_EQ(2U, pipelines.size());
293 
294   const auto* pipeline = pipelines[0].get();
295   const auto& color_buffers1 = pipeline->GetColorAttachments();
296   ASSERT_EQ(1U, color_buffers1.size());
297 
298   const auto& buf1 = color_buffers1[0];
299   ASSERT_TRUE(buf1.buffer != nullptr);
300   EXPECT_EQ(0, buf1.location);
301   EXPECT_EQ(90 * 180, buf1.buffer->ElementCount());
302   EXPECT_EQ(90 * 180 * 4, buf1.buffer->ValueCount());
303   EXPECT_EQ(90 * 180 * 4 * sizeof(float), buf1.buffer->GetSizeInBytes());
304 
305   pipeline = pipelines[1].get();
306   const auto& color_buffers2 = pipeline->GetColorAttachments();
307   const auto& buf2 = color_buffers2[0];
308   ASSERT_TRUE(buf2.buffer != nullptr);
309   EXPECT_EQ(9, buf2.location);
310   EXPECT_EQ(256 * 300, buf2.buffer->ElementCount());
311   EXPECT_EQ(256 * 300 * 4, buf2.buffer->ValueCount());
312   EXPECT_EQ(256 * 300 * 4 * sizeof(uint8_t), buf2.buffer->GetSizeInBytes());
313 }
314 
TEST_F(AmberScriptParserTest,BindColorFBSizeSetBeforeBuffer)315 TEST_F(AmberScriptParserTest, BindColorFBSizeSetBeforeBuffer) {
316   std::string in = R"(
317 SHADER vertex my_shader PASSTHROUGH
318 SHADER fragment my_fragment GLSL
319 # GLSL Shader
320 END
321 BUFFER my_fb FORMAT R32G32B32A32_SFLOAT
322 
323 PIPELINE graphics my_pipeline
324   ATTACH my_shader
325   ATTACH my_fragment
326 
327   FRAMEBUFFER_SIZE 90 180
328   BIND BUFFER my_fb AS color LOCATION 0
329 END)";
330 
331   Parser parser;
332   Result r = parser.Parse(in);
333   ASSERT_TRUE(r.IsSuccess()) << r.Error();
334 
335   auto script = parser.GetScript();
336   const auto& pipelines = script->GetPipelines();
337   ASSERT_EQ(1U, pipelines.size());
338 
339   const auto* pipeline = pipelines[0].get();
340   const auto& color_buffers1 = pipeline->GetColorAttachments();
341   ASSERT_EQ(1U, color_buffers1.size());
342 
343   const auto& buf1 = color_buffers1[0];
344   ASSERT_TRUE(buf1.buffer != nullptr);
345   EXPECT_EQ(0, buf1.location);
346   EXPECT_EQ(90 * 180, buf1.buffer->ElementCount());
347   EXPECT_EQ(90 * 180 * 4, buf1.buffer->ValueCount());
348   EXPECT_EQ(90 * 180 * 4 * sizeof(float), buf1.buffer->GetSizeInBytes());
349 }
350 
TEST_F(AmberScriptParserTest,BindColorFBSizeSetAfterBuffer)351 TEST_F(AmberScriptParserTest, BindColorFBSizeSetAfterBuffer) {
352   std::string in = R"(
353 SHADER vertex my_shader PASSTHROUGH
354 SHADER fragment my_fragment GLSL
355 # GLSL Shader
356 END
357 BUFFER my_fb FORMAT R32G32B32A32_SFLOAT
358 
359 PIPELINE graphics my_pipeline
360   ATTACH my_shader
361   ATTACH my_fragment
362 
363   BIND BUFFER my_fb AS color LOCATION 0
364   FRAMEBUFFER_SIZE 90 180
365 END)";
366 
367   Parser parser;
368   Result r = parser.Parse(in);
369   ASSERT_TRUE(r.IsSuccess()) << r.Error();
370 
371   auto script = parser.GetScript();
372   const auto& pipelines = script->GetPipelines();
373   ASSERT_EQ(1U, pipelines.size());
374 
375   const auto* pipeline = pipelines[0].get();
376   const auto& color_buffers1 = pipeline->GetColorAttachments();
377   ASSERT_EQ(1U, color_buffers1.size());
378 
379   const auto& buf1 = color_buffers1[0];
380   ASSERT_TRUE(buf1.buffer != nullptr);
381   EXPECT_EQ(0, buf1.location);
382   EXPECT_EQ(90 * 180, buf1.buffer->ElementCount());
383   EXPECT_EQ(90 * 180 * 4, buf1.buffer->ValueCount());
384   EXPECT_EQ(90 * 180 * 4 * sizeof(float), buf1.buffer->GetSizeInBytes());
385 }
386 
TEST_F(AmberScriptParserTest,BindDepthBuffer)387 TEST_F(AmberScriptParserTest, BindDepthBuffer) {
388   std::string in = R"(
389 SHADER vertex my_shader PASSTHROUGH
390 SHADER fragment my_fragment GLSL
391 # GLSL Shader
392 END
393 BUFFER my_buf FORMAT R32G32B32A32_SFLOAT
394 
395 PIPELINE graphics my_pipeline
396   ATTACH my_shader
397   ATTACH my_fragment
398 
399   BIND BUFFER my_buf AS depth_stencil
400   FRAMEBUFFER_SIZE 90 180
401 END)";
402 
403   Parser parser;
404   Result r = parser.Parse(in);
405   ASSERT_TRUE(r.IsSuccess()) << r.Error();
406 
407   auto script = parser.GetScript();
408   const auto& pipelines = script->GetPipelines();
409   ASSERT_EQ(1U, pipelines.size());
410 
411   const auto* pipeline = pipelines[0].get();
412   const auto& buf = pipeline->GetDepthBuffer();
413   ASSERT_TRUE(buf.buffer != nullptr);
414   EXPECT_EQ(90 * 180, buf.buffer->ElementCount());
415   EXPECT_EQ(90 * 180 * 4, buf.buffer->ValueCount());
416   EXPECT_EQ(90 * 180 * 4 * sizeof(float), buf.buffer->GetSizeInBytes());
417 }
418 
TEST_F(AmberScriptParserTest,BindDepthBufferExtraParams)419 TEST_F(AmberScriptParserTest, BindDepthBufferExtraParams) {
420   std::string in = R"(
421 SHADER vertex my_shader PASSTHROUGH
422 SHADER fragment my_fragment GLSL
423 # GLSL Shader
424 END
425 BUFFER my_buf FORMAT R32G32B32A32_SFLOAT
426 
427 PIPELINE graphics my_pipeline
428   ATTACH my_shader
429   ATTACH my_fragment
430 
431   BIND BUFFER my_buf AS depth_stencil EXTRA
432   FRAMEBUFFER_SIZE 90 180
433 END)";
434 
435   Parser parser;
436   Result r = parser.Parse(in);
437   ASSERT_FALSE(r.IsSuccess());
438   EXPECT_EQ("12: extra parameters after BIND command", r.Error());
439 }
440 
TEST_F(AmberScriptParserTest,BindBufferMissingBufferName)441 TEST_F(AmberScriptParserTest, BindBufferMissingBufferName) {
442   std::string in = R"(
443 SHADER vertex my_shader PASSTHROUGH
444 SHADER fragment my_fragment GLSL
445 # GLSL Shader
446 END
447 BUFFER my_buf FORMAT R32G32B32A32_SFLOAT
448 
449 PIPELINE graphics my_pipeline
450   ATTACH my_shader
451   ATTACH my_fragment
452 
453   BIND BUFFER AS depth_stencil
454   FRAMEBUFFER_SIZE 90 180
455 END)";
456 
457   Parser parser;
458   Result r = parser.Parse(in);
459   ASSERT_FALSE(r.IsSuccess());
460   EXPECT_EQ("12: unknown buffer: AS", r.Error());
461 }
462 
TEST_F(AmberScriptParserTest,BindBufferAsMissingType)463 TEST_F(AmberScriptParserTest, BindBufferAsMissingType) {
464   std::string in = R"(
465 SHADER vertex my_shader PASSTHROUGH
466 SHADER fragment my_fragment GLSL
467 # GLSL Shader
468 END
469 BUFFER my_buf FORMAT R32G32B32A32_SFLOAT
470 
471 PIPELINE graphics my_pipeline
472   ATTACH my_shader
473   ATTACH my_fragment
474 
475   BIND BUFFER my_buf AS
476   FRAMEBUFFER_SIZE 90 180
477 END)";
478 
479   Parser parser;
480   Result r = parser.Parse(in);
481   ASSERT_FALSE(r.IsSuccess());
482   EXPECT_EQ("13: invalid token for BUFFER type", r.Error());
483 }
484 
TEST_F(AmberScriptParserTest,BindBufferAsInvalidType)485 TEST_F(AmberScriptParserTest, BindBufferAsInvalidType) {
486   std::string in = R"(
487 SHADER vertex my_shader PASSTHROUGH
488 SHADER fragment my_fragment GLSL
489 # GLSL Shader
490 END
491 BUFFER my_buf FORMAT R32G32B32A32_SFLOAT
492 
493 PIPELINE graphics my_pipeline
494   ATTACH my_shader
495   ATTACH my_fragment
496 
497   BIND BUFFER my_buf AS
498   FRAMEBUFFER_SIZE 90 180
499 END)";
500 
501   Parser parser;
502   Result r = parser.Parse(in);
503   ASSERT_FALSE(r.IsSuccess());
504   EXPECT_EQ("13: invalid token for BUFFER type", r.Error());
505 }
506 
TEST_F(AmberScriptParserTest,BindDepthBufferUnknownBuffer)507 TEST_F(AmberScriptParserTest, BindDepthBufferUnknownBuffer) {
508   std::string in = R"(
509 SHADER vertex my_shader PASSTHROUGH
510 SHADER fragment my_fragment GLSL
511 # GLSL Shader
512 END
513 
514 PIPELINE graphics my_pipeline
515   ATTACH my_shader
516   ATTACH my_fragment
517 
518   BIND BUFFER my_buf AS depth_stencil
519   FRAMEBUFFER_SIZE 90 180
520 END)";
521 
522   Parser parser;
523   Result r = parser.Parse(in);
524   ASSERT_FALSE(r.IsSuccess());
525   EXPECT_EQ("11: unknown buffer: my_buf", r.Error());
526 }
527 
TEST_F(AmberScriptParserTest,BindBufferMultipleDepthBuffers)528 TEST_F(AmberScriptParserTest, BindBufferMultipleDepthBuffers) {
529   std::string in = R"(
530 SHADER vertex my_shader PASSTHROUGH
531 SHADER fragment my_fragment GLSL
532 # GLSL Shader
533 END
534 BUFFER my_buf FORMAT R32G32B32A32_SFLOAT
535 BUFFER my_buf2 FORMAT R32G32B32A32_SFLOAT
536 
537 PIPELINE graphics my_pipeline
538   ATTACH my_shader
539   ATTACH my_fragment
540 
541   BIND BUFFER my_buf AS depth_stencil
542   BIND BUFFER my_buf AS depth_stencil
543 END)";
544 
545   Parser parser;
546   Result r = parser.Parse(in);
547   ASSERT_FALSE(r.IsSuccess());
548   EXPECT_EQ("14: can only bind one depth buffer in a PIPELINE", r.Error());
549 }
550 
TEST_F(AmberScriptParserTest,BindVertexData)551 TEST_F(AmberScriptParserTest, BindVertexData) {
552   std::string in = R"(
553 SHADER vertex my_shader PASSTHROUGH
554 SHADER fragment my_fragment GLSL
555 # GLSL Shader
556 END
557 BUFFER my_buf DATA_TYPE int8 SIZE 5 FILL 5
558 BUFFER my_buf2 DATA_TYPE int8 SIZE 5 FILL 5
559 
560 PIPELINE graphics my_pipeline
561   ATTACH my_shader
562   ATTACH my_fragment
563 
564   VERTEX_DATA my_buf LOCATION 0
565   VERTEX_DATA my_buf2 LOCATION 1
566 END)";
567 
568   Parser parser;
569   Result r = parser.Parse(in);
570   ASSERT_TRUE(r.IsSuccess()) << r.Error();
571 
572   auto script = parser.GetScript();
573   const auto& pipelines = script->GetPipelines();
574   ASSERT_EQ(1U, pipelines.size());
575 
576   const auto* pipeline = pipelines[0].get();
577   const auto& vertex_buffers = pipeline->GetVertexBuffers();
578   ASSERT_EQ(2, vertex_buffers.size());
579 
580   const auto& info1 = vertex_buffers[0];
581   ASSERT_TRUE(info1.buffer != nullptr);
582   EXPECT_EQ(0, info1.location);
583 
584   const auto& info2 = vertex_buffers[1];
585   ASSERT_TRUE(info2.buffer != nullptr);
586   EXPECT_EQ(1, info2.location);
587 }
588 
TEST_F(AmberScriptParserTest,BindVertexDataDuplicateLocation)589 TEST_F(AmberScriptParserTest, BindVertexDataDuplicateLocation) {
590   std::string in = R"(
591 SHADER vertex my_shader PASSTHROUGH
592 SHADER fragment my_fragment GLSL
593 # GLSL Shader
594 END
595 BUFFER my_buf DATA_TYPE int8 SIZE 50 FILL 5
596 BUFFER my_buf2 DATA_TYPE int8 SIZE 50 FILL 5
597 
598 PIPELINE graphics my_pipeline
599   ATTACH my_shader
600   ATTACH my_fragment
601 
602   VERTEX_DATA my_buf LOCATION 0
603   VERTEX_DATA my_buf2 LOCATION 0
604 END)";
605 
606   Parser parser;
607   Result r = parser.Parse(in);
608   ASSERT_FALSE(r.IsSuccess());
609   EXPECT_EQ("14: can not bind two vertex buffers to the same LOCATION",
610             r.Error());
611 }
612 
TEST_F(AmberScriptParserTest,BindVertexDataDuplicateBinding)613 TEST_F(AmberScriptParserTest, BindVertexDataDuplicateBinding) {
614   std::string in = R"(
615 SHADER vertex my_shader PASSTHROUGH
616 SHADER fragment my_fragment GLSL
617 # GLSL Shader
618 END
619 BUFFER my_buf DATA_TYPE int8 SIZE 50 FILL 5
620 
621 PIPELINE graphics my_pipeline
622   ATTACH my_shader
623   ATTACH my_fragment
624 
625   VERTEX_DATA my_buf LOCATION 0
626   VERTEX_DATA my_buf LOCATION 1
627 END)";
628 
629   Parser parser;
630   Result r = parser.Parse(in);
631   ASSERT_FALSE(r.IsSuccess());
632   EXPECT_EQ("13: vertex buffer may only be bound to a PIPELINE once",
633             r.Error());
634 }
635 
TEST_F(AmberScriptParserTest,BindVertexDataMissingBuffer)636 TEST_F(AmberScriptParserTest, BindVertexDataMissingBuffer) {
637   std::string in = R"(
638 SHADER vertex my_shader PASSTHROUGH
639 SHADER fragment my_fragment GLSL
640 # GLSL Shader
641 END
642 BUFFER my_buf DATA_TYPE int8 SIZE 50 FILL 5
643 
644 PIPELINE graphics my_pipeline
645   ATTACH my_shader
646   ATTACH my_fragment
647 
648   VERTEX_DATA LOCATION 0
649 END)";
650 
651   Parser parser;
652   Result r = parser.Parse(in);
653   ASSERT_FALSE(r.IsSuccess());
654   EXPECT_EQ("12: unknown buffer: LOCATION", r.Error());
655 }
656 
TEST_F(AmberScriptParserTest,BindVertexDataUnknownBuffer)657 TEST_F(AmberScriptParserTest, BindVertexDataUnknownBuffer) {
658   std::string in = R"(
659 SHADER vertex my_shader PASSTHROUGH
660 SHADER fragment my_fragment GLSL
661 # GLSL Shader
662 END
663 
664 PIPELINE graphics my_pipeline
665   ATTACH my_shader
666   ATTACH my_fragment
667 
668   VERTEX_DATA my_buf LOCATION 0
669 END)";
670 
671   Parser parser;
672   Result r = parser.Parse(in);
673   ASSERT_FALSE(r.IsSuccess());
674   EXPECT_EQ("11: unknown buffer: my_buf", r.Error());
675 }
676 
TEST_F(AmberScriptParserTest,BindVertexDataMissingLocation)677 TEST_F(AmberScriptParserTest, BindVertexDataMissingLocation) {
678   std::string in = R"(
679 SHADER vertex my_shader PASSTHROUGH
680 SHADER fragment my_fragment GLSL
681 # GLSL Shader
682 END
683 BUFFER my_buf DATA_TYPE int8 SIZE 50 FILL 5
684 
685 PIPELINE graphics my_pipeline
686   ATTACH my_shader
687   ATTACH my_fragment
688 
689   VERTEX_DATA my_buf
690 END)";
691 
692   Parser parser;
693   Result r = parser.Parse(in);
694   ASSERT_FALSE(r.IsSuccess());
695   EXPECT_EQ("13: VERTEX_DATA missing LOCATION", r.Error());
696 }
697 
TEST_F(AmberScriptParserTest,BindVertexDataMissingLocationValue)698 TEST_F(AmberScriptParserTest, BindVertexDataMissingLocationValue) {
699   std::string in = R"(
700 SHADER vertex my_shader PASSTHROUGH
701 SHADER fragment my_fragment GLSL
702 # GLSL Shader
703 END
704 BUFFER my_buf DATA_TYPE int8 SIZE 50 FILL 5
705 
706 PIPELINE graphics my_pipeline
707   ATTACH my_shader
708   ATTACH my_fragment
709 
710   VERTEX_DATA my_buf LOCATION
711 END)";
712 
713   Parser parser;
714   Result r = parser.Parse(in);
715   ASSERT_FALSE(r.IsSuccess());
716   EXPECT_EQ("13: invalid value for VERTEX_DATA LOCATION", r.Error());
717 }
718 
TEST_F(AmberScriptParserTest,BindVertexDataExtraParameters)719 TEST_F(AmberScriptParserTest, BindVertexDataExtraParameters) {
720   std::string in = R"(
721 SHADER vertex my_shader PASSTHROUGH
722 SHADER fragment my_fragment GLSL
723 # GLSL Shader
724 END
725 BUFFER my_buf DATA_TYPE int8 SIZE 50 FILL 5
726 
727 PIPELINE graphics my_pipeline
728   ATTACH my_shader
729   ATTACH my_fragment
730 
731   VERTEX_DATA my_buf LOCATION 0 EXTRA
732 END)";
733 
734   Parser parser;
735   Result r = parser.Parse(in);
736   ASSERT_FALSE(r.IsSuccess());
737   EXPECT_EQ("12: extra parameters after VERTEX_DATA command", r.Error());
738 }
739 
TEST_F(AmberScriptParserTest,BindIndexData)740 TEST_F(AmberScriptParserTest, BindIndexData) {
741   std::string in = R"(
742 SHADER vertex my_shader PASSTHROUGH
743 SHADER fragment my_fragment GLSL
744 # GLSL Shader
745 END
746 BUFFER my_buf DATA_TYPE int8 SIZE 50 FILL 5
747 
748 PIPELINE graphics my_pipeline
749   ATTACH my_shader
750   ATTACH my_fragment
751 
752   INDEX_DATA my_buf
753 END)";
754 
755   Parser parser;
756   Result r = parser.Parse(in);
757   ASSERT_TRUE(r.IsSuccess()) << r.Error();
758 
759   auto script = parser.GetScript();
760   const auto& pipelines = script->GetPipelines();
761   ASSERT_EQ(1U, pipelines.size());
762 
763   const auto* pipeline = pipelines[0].get();
764   const auto* buf = pipeline->GetIndexBuffer();
765   ASSERT_TRUE(buf != nullptr);
766 }
767 
TEST_F(AmberScriptParserTest,BindIndexataMissingBuffer)768 TEST_F(AmberScriptParserTest, BindIndexataMissingBuffer) {
769   std::string in = R"(
770 SHADER vertex my_shader PASSTHROUGH
771 SHADER fragment my_fragment GLSL
772 # GLSL Shader
773 END
774 BUFFER my_buf FORMAT R32G32B32A32_SFLOAT
775 
776 PIPELINE graphics my_pipeline
777   ATTACH my_shader
778   ATTACH my_fragment
779 
780   INDEX_DATA
781 END)";
782 
783   Parser parser;
784   Result r = parser.Parse(in);
785   ASSERT_FALSE(r.IsSuccess());
786   EXPECT_EQ("13: missing buffer name in INDEX_DATA command", r.Error());
787 }
788 
TEST_F(AmberScriptParserTest,BindIndexDataUnknownBuffer)789 TEST_F(AmberScriptParserTest, BindIndexDataUnknownBuffer) {
790   std::string in = R"(
791 SHADER vertex my_shader PASSTHROUGH
792 SHADER fragment my_fragment GLSL
793 # GLSL Shader
794 END
795 
796 PIPELINE graphics my_pipeline
797   ATTACH my_shader
798   ATTACH my_fragment
799 
800   INDEX_DATA my_buf
801 END)";
802 
803   Parser parser;
804   Result r = parser.Parse(in);
805   ASSERT_FALSE(r.IsSuccess());
806   EXPECT_EQ("11: unknown buffer: my_buf", r.Error());
807 }
808 
TEST_F(AmberScriptParserTest,BindIndexDataExtraParameters)809 TEST_F(AmberScriptParserTest, BindIndexDataExtraParameters) {
810   std::string in = R"(
811 SHADER vertex my_shader PASSTHROUGH
812 SHADER fragment my_fragment GLSL
813 # GLSL Shader
814 END
815 BUFFER my_buf FORMAT R32G32B32A32_SFLOAT
816 
817 PIPELINE graphics my_pipeline
818   ATTACH my_shader
819   ATTACH my_fragment
820 
821   INDEX_DATA my_buf EXTRA
822 END)";
823 
824   Parser parser;
825   Result r = parser.Parse(in);
826   ASSERT_FALSE(r.IsSuccess());
827   EXPECT_EQ("12: extra parameters after INDEX_DATA command", r.Error());
828 }
829 
TEST_F(AmberScriptParserTest,BindIndexDataMultiple)830 TEST_F(AmberScriptParserTest, BindIndexDataMultiple) {
831   std::string in = R"(
832 SHADER vertex my_shader PASSTHROUGH
833 SHADER fragment my_fragment GLSL
834 # GLSL Shader
835 END
836 BUFFER my_buf FORMAT R32G32B32A32_SFLOAT
837 
838 PIPELINE graphics my_pipeline
839   ATTACH my_shader
840   ATTACH my_fragment
841 
842   INDEX_DATA my_buf
843   INDEX_DATA my_buf
844 END)";
845 
846   Parser parser;
847   Result r = parser.Parse(in);
848   ASSERT_FALSE(r.IsSuccess());
849   EXPECT_EQ("13: can only bind one INDEX_DATA buffer in a pipeline", r.Error());
850 }
851 
TEST_F(AmberScriptParserTest,BindBuffer)852 TEST_F(AmberScriptParserTest, BindBuffer) {
853   std::string in = R"(
854 SHADER vertex my_shader PASSTHROUGH
855 SHADER fragment my_fragment GLSL
856 # GLSL Shader
857 END
858 BUFFER my_buf FORMAT R32G32B32A32_SFLOAT
859 
860 PIPELINE graphics my_pipeline
861   ATTACH my_shader
862   ATTACH my_fragment
863 
864   BIND BUFFER my_buf AS uniform DESCRIPTOR_SET 1 BINDING 2
865 END
866 )";
867 
868   Parser parser;
869   Result r = parser.Parse(in);
870   ASSERT_TRUE(r.IsSuccess()) << r.Error();
871 
872   auto script = parser.GetScript();
873   const auto& pipelines = script->GetPipelines();
874   ASSERT_EQ(1U, pipelines.size());
875 
876   const auto* pipeline = pipelines[0].get();
877   const auto& bufs = pipeline->GetBuffers();
878   ASSERT_EQ(1U, bufs.size());
879   EXPECT_EQ(BufferType::kUniform, bufs[0].buffer->GetBufferType());
880   EXPECT_EQ(1U, bufs[0].descriptor_set);
881   EXPECT_EQ(2U, bufs[0].binding);
882   EXPECT_EQ(static_cast<uint32_t>(0), bufs[0].location);
883   EXPECT_EQ(FormatType::kR32G32B32A32_SFLOAT,
884             bufs[0].buffer->GetFormat()->GetFormatType());
885 }
886 
TEST_F(AmberScriptParserTest,BindBufferMissingBindingValue)887 TEST_F(AmberScriptParserTest, BindBufferMissingBindingValue) {
888   std::string in = R"(
889 SHADER vertex my_shader PASSTHROUGH
890 SHADER fragment my_fragment GLSL
891 # GLSL Shader
892 END
893 BUFFER my_buf FORMAT R32G32B32A32_SFLOAT
894 
895 PIPELINE graphics my_pipeline
896   ATTACH my_shader
897   ATTACH my_fragment
898 
899   BIND BUFFER my_buf AS uniform DESCRIPTOR_SET 1 BINDING
900 END)";
901 
902   Parser parser;
903   Result r = parser.Parse(in);
904   ASSERT_FALSE(r.IsSuccess());
905   EXPECT_EQ("13: invalid value for BINDING in BIND command", r.Error());
906 }
907 
TEST_F(AmberScriptParserTest,BindBufferMissingBinding)908 TEST_F(AmberScriptParserTest, BindBufferMissingBinding) {
909   std::string in = R"(
910 SHADER vertex my_shader PASSTHROUGH
911 SHADER fragment my_fragment GLSL
912 # GLSL Shader
913 END
914 BUFFER my_buf FORMAT R32G32B32A32_SFLOAT
915 
916 PIPELINE graphics my_pipeline
917   ATTACH my_shader
918   ATTACH my_fragment
919 
920   BIND BUFFER my_buf AS uniform DESCRIPTOR_SET 1
921 END)";
922 
923   Parser parser;
924   Result r = parser.Parse(in);
925   ASSERT_FALSE(r.IsSuccess());
926   EXPECT_EQ("13: missing BINDING for BIND command", r.Error());
927 }
928 
TEST_F(AmberScriptParserTest,BindBufferMissingDescriptorSetValue)929 TEST_F(AmberScriptParserTest, BindBufferMissingDescriptorSetValue) {
930   std::string in = R"(
931 SHADER vertex my_shader PASSTHROUGH
932 SHADER fragment my_fragment GLSL
933 # GLSL Shader
934 END
935 BUFFER my_buf FORMAT R32G32B32A32_SFLOAT
936 
937 PIPELINE graphics my_pipeline
938   ATTACH my_shader
939   ATTACH my_fragment
940 
941   BIND BUFFER my_buf AS uniform DESCRIPTOR_SET BINDING 2
942 END)";
943 
944   Parser parser;
945   Result r = parser.Parse(in);
946   ASSERT_FALSE(r.IsSuccess());
947   EXPECT_EQ("12: invalid value for DESCRIPTOR_SET in BIND command", r.Error());
948 }
949 
TEST_F(AmberScriptParserTest,BindBufferMissingDescriptorSet)950 TEST_F(AmberScriptParserTest, BindBufferMissingDescriptorSet) {
951   std::string in = R"(
952 SHADER vertex my_shader PASSTHROUGH
953 SHADER fragment my_fragment GLSL
954 # GLSL Shader
955 END
956 BUFFER my_buf FORMAT R32G32B32A32_SFLOAT
957 
958 PIPELINE graphics my_pipeline
959   ATTACH my_shader
960   ATTACH my_fragment
961 
962   BIND BUFFER my_buf AS uniform BINDING 2
963 END)";
964 
965   Parser parser;
966   Result r = parser.Parse(in);
967   ASSERT_FALSE(r.IsSuccess());
968   EXPECT_EQ("12: missing DESCRIPTOR_SET or KERNEL for BIND command", r.Error());
969 }
970 
TEST_F(AmberScriptParserTest,BindingBufferExtraParams)971 TEST_F(AmberScriptParserTest, BindingBufferExtraParams) {
972   std::string in = R"(
973 SHADER vertex my_shader PASSTHROUGH
974 SHADER fragment my_fragment GLSL
975 # GLSL Shader
976 END
977 BUFFER my_buf FORMAT R32G32B32A32_SFLOAT
978 
979 PIPELINE graphics my_pipeline
980   ATTACH my_shader
981   ATTACH my_fragment
982 
983   BIND BUFFER my_buf AS uniform DESCRIPTOR_SET 1 BINDING 2 EXTRA
984 END)";
985 
986   Parser parser;
987   Result r = parser.Parse(in);
988   ASSERT_FALSE(r.IsSuccess());
989   EXPECT_EQ("12: extra parameters after BIND command", r.Error());
990 }
991 
TEST_F(AmberScriptParserTest,BindingBufferInvalidBindingValue)992 TEST_F(AmberScriptParserTest, BindingBufferInvalidBindingValue) {
993   std::string in = R"(
994 SHADER vertex my_shader PASSTHROUGH
995 SHADER fragment my_fragment GLSL
996 # GLSL Shader
997 END
998 BUFFER my_buf FORMAT R32G32B32A32_SFLOAT
999 
1000 PIPELINE graphics my_pipeline
1001   ATTACH my_shader
1002   ATTACH my_fragment
1003 
1004   BIND BUFFER my_buf AS uniform DESCRIPTOR_SET 1 BINDING INVALID
1005 END)";
1006 
1007   Parser parser;
1008   Result r = parser.Parse(in);
1009   ASSERT_FALSE(r.IsSuccess());
1010   EXPECT_EQ("12: invalid value for BINDING in BIND command", r.Error());
1011 }
1012 
TEST_F(AmberScriptParserTest,BindingBufferInvalidDescriptorSetValue)1013 TEST_F(AmberScriptParserTest, BindingBufferInvalidDescriptorSetValue) {
1014   std::string in = R"(
1015 SHADER vertex my_shader PASSTHROUGH
1016 SHADER fragment my_fragment GLSL
1017 # GLSL Shader
1018 END
1019 BUFFER my_buf FORMAT R32G32B32A32_SFLOAT
1020 
1021 PIPELINE graphics my_pipeline
1022   ATTACH my_shader
1023   ATTACH my_fragment
1024 
1025   BIND BUFFER my_buf AS uniform DESCRIPTOR_SET INVALID BINDING 2
1026 END)";
1027 
1028   Parser parser;
1029   Result r = parser.Parse(in);
1030   ASSERT_FALSE(r.IsSuccess());
1031   EXPECT_EQ("12: invalid value for DESCRIPTOR_SET in BIND command", r.Error());
1032 }
1033 
TEST_F(AmberScriptParserTest,BindingBufferInvalidBufferType)1034 TEST_F(AmberScriptParserTest, BindingBufferInvalidBufferType) {
1035   std::string in = R"(
1036 SHADER vertex my_shader PASSTHROUGH
1037 SHADER fragment my_fragment GLSL
1038 # GLSL Shader
1039 END
1040 BUFFER my_buf FORMAT R32G32B32A32_SFLOAT
1041 
1042 PIPELINE graphics my_pipeline
1043   ATTACH my_shader
1044   ATTACH my_fragment
1045 
1046   BIND BUFFER my_buf AS INVALID DESCRIPTOR_SET 1 BINDING 2
1047 END)";
1048 
1049   Parser parser;
1050   Result r = parser.Parse(in);
1051   ASSERT_FALSE(r.IsSuccess());
1052   EXPECT_EQ("12: unknown buffer_type: INVALID", r.Error());
1053 }
1054 
1055 struct BufferTypeData {
1056   const char* name;
1057   BufferType type;
1058 };
1059 
1060 using AmberScriptParserBufferTypeTest = testing::TestWithParam<BufferTypeData>;
TEST_P(AmberScriptParserBufferTypeTest,BufferType)1061 TEST_P(AmberScriptParserBufferTypeTest, BufferType) {
1062   auto test_data = GetParam();
1063 
1064   std::string in = R"(
1065 SHADER vertex my_shader PASSTHROUGH
1066 SHADER fragment my_fragment GLSL
1067 # GLSL Shader
1068 END
1069 BUFFER my_buf FORMAT R32G32B32A32_SFLOAT
1070 
1071 PIPELINE graphics my_pipeline
1072   ATTACH my_shader
1073   ATTACH my_fragment
1074 
1075   BIND BUFFER my_buf AS )" +
1076                    std::string(test_data.name) +
1077                    " DESCRIPTOR_SET 0 BINDING 0\nEND";
1078 
1079   Parser parser;
1080   Result r = parser.Parse(in);
1081   ASSERT_TRUE(r.IsSuccess()) << r.Error();
1082 
1083   auto script = parser.GetScript();
1084   const auto& pipelines = script->GetPipelines();
1085   ASSERT_EQ(1U, pipelines.size());
1086 
1087   const auto* pipeline = pipelines[0].get();
1088   const auto& bufs = pipeline->GetBuffers();
1089   ASSERT_EQ(1U, bufs.size());
1090   EXPECT_EQ(test_data.type, bufs[0].buffer->GetBufferType());
1091 }
1092 INSTANTIATE_TEST_SUITE_P(
1093     AmberScriptParserBufferTypeTestSamples,
1094     AmberScriptParserBufferTypeTest,
1095     testing::Values(BufferTypeData{"uniform", BufferType::kUniform},
1096                     BufferTypeData{
1097                         "storage",
1098                         BufferType::kStorage}));  // NOLINT(whitespace/parens)
1099 
TEST_F(AmberScriptParserTest,BindPushConstants)1100 TEST_F(AmberScriptParserTest, BindPushConstants) {
1101   std::string in = R"(
1102 SHADER vertex my_shader PASSTHROUGH
1103 SHADER fragment my_fragment GLSL
1104 # GLSL Shader
1105 END
1106 BUFFER my_buf DATA_TYPE float SIZE 20 FILL 5
1107 
1108 PIPELINE graphics my_pipeline
1109   ATTACH my_shader
1110   ATTACH my_fragment
1111 
1112   BIND BUFFER my_buf AS push_constant
1113 END)";
1114 
1115   Parser parser;
1116   Result r = parser.Parse(in);
1117   ASSERT_TRUE(r.IsSuccess()) << r.Error();
1118 
1119   auto script = parser.GetScript();
1120   const auto& pipelines = script->GetPipelines();
1121   ASSERT_EQ(1U, pipelines.size());
1122 
1123   const auto* pipeline = pipelines[0].get();
1124   const auto& buf = pipeline->GetPushConstantBuffer();
1125   ASSERT_TRUE(buf.buffer != nullptr);
1126   EXPECT_EQ(20, buf.buffer->ElementCount());
1127   EXPECT_EQ(20, buf.buffer->ValueCount());
1128   EXPECT_EQ(20 * sizeof(float), buf.buffer->GetSizeInBytes());
1129 }
1130 
TEST_F(AmberScriptParserTest,BindPushConstantsExtraParams)1131 TEST_F(AmberScriptParserTest, BindPushConstantsExtraParams) {
1132   std::string in = R"(
1133 SHADER vertex my_shader PASSTHROUGH
1134 SHADER fragment my_fragment GLSL
1135 # GLSL Shader
1136 END
1137 BUFFER my_buf DATA_TYPE float SIZE 20 FILL 5
1138 
1139 PIPELINE graphics my_pipeline
1140   ATTACH my_shader
1141   ATTACH my_fragment
1142 
1143   BIND BUFFER my_buf AS push_constant EXTRA
1144 END)";
1145 
1146   Parser parser;
1147   Result r = parser.Parse(in);
1148   ASSERT_FALSE(r.IsSuccess());
1149   EXPECT_EQ("12: extra parameters after BIND command", r.Error());
1150 }
1151 
TEST_F(AmberScriptParserTest,BindBufferOpenCLArgName)1152 TEST_F(AmberScriptParserTest, BindBufferOpenCLArgName) {
1153   std::string in = R"(
1154 SHADER compute my_shader OPENCL-C
1155 #shader
1156 END
1157 BUFFER my_buf DATA_TYPE uint32 DATA 1 END
1158 
1159 PIPELINE compute my_pipeline
1160   ATTACH my_shader
1161   BIND BUFFER my_buf AS storage KERNEL ARG_NAME arg
1162 END)";
1163 
1164   Parser parser;
1165   Result r = parser.Parse(in);
1166   ASSERT_TRUE(r.IsSuccess());
1167 }
1168 
TEST_F(AmberScriptParserTest,BindBufferOpenCLArgNumber)1169 TEST_F(AmberScriptParserTest, BindBufferOpenCLArgNumber) {
1170   std::string in = R"(
1171 SHADER compute my_shader OPENCL-C
1172 #shader
1173 END
1174 BUFFER my_buf DATA_TYPE uint32 DATA 1 END
1175 
1176 PIPELINE compute my_pipeline
1177   ATTACH my_shader
1178   BIND BUFFER my_buf AS storage KERNEL ARG_NUMBER 0
1179 END)";
1180 
1181   Parser parser;
1182   Result r = parser.Parse(in);
1183   ASSERT_TRUE(r.IsSuccess());
1184 }
1185 
TEST_F(AmberScriptParserTest,BindBufferOpenCLArgNameTypeless)1186 TEST_F(AmberScriptParserTest, BindBufferOpenCLArgNameTypeless) {
1187   std::string in = R"(
1188 SHADER compute my_shader OPENCL-C
1189 #shader
1190 END
1191 BUFFER my_buf DATA_TYPE uint32 DATA 1 END
1192 
1193 PIPELINE compute my_pipeline
1194   ATTACH my_shader
1195   BIND BUFFER my_buf KERNEL ARG_NAME arg
1196 END)";
1197 
1198   Parser parser;
1199   Result r = parser.Parse(in);
1200   ASSERT_TRUE(r.IsSuccess());
1201 }
1202 
TEST_F(AmberScriptParserTest,BindBufferOpenCLArgNumberTypeless)1203 TEST_F(AmberScriptParserTest, BindBufferOpenCLArgNumberTypeless) {
1204   std::string in = R"(
1205 SHADER compute my_shader OPENCL-C
1206 #shader
1207 END
1208 BUFFER my_buf DATA_TYPE uint32 DATA 1 END
1209 
1210 PIPELINE compute my_pipeline
1211   ATTACH my_shader
1212   BIND BUFFER my_buf KERNEL ARG_NUMBER 0
1213 END)";
1214 
1215   Parser parser;
1216   Result r = parser.Parse(in);
1217   ASSERT_TRUE(r.IsSuccess());
1218 }
1219 
TEST_F(AmberScriptParserTest,BindBufferOpenCLMissingKernel)1220 TEST_F(AmberScriptParserTest, BindBufferOpenCLMissingKernel) {
1221   std::string in = R"(
1222 SHADER compute my_shader OPENCL-C
1223 #shader
1224 END
1225 BUFFER my_buf DATA_TYPE uint32 DATA 1 END
1226 
1227 PIPELINE compute my_pipeline
1228   ATTACH my_shader
1229   BIND BUFFER my_buf AS storage ARG_NAME arg
1230 END)";
1231 
1232   Parser parser;
1233   Result r = parser.Parse(in);
1234   ASSERT_FALSE(r.IsSuccess());
1235   EXPECT_EQ("9: missing DESCRIPTOR_SET or KERNEL for BIND command", r.Error());
1236 }
1237 
TEST_F(AmberScriptParserTest,BindBufferOpenCLMissingArg)1238 TEST_F(AmberScriptParserTest, BindBufferOpenCLMissingArg) {
1239   std::string in = R"(
1240 SHADER compute my_shader OPENCL-C
1241 #shader
1242 END
1243 BUFFER my_buf DATA_TYPE uint32 DATA 1 END
1244 
1245 PIPELINE compute my_pipeline
1246   ATTACH my_shader
1247   BIND BUFFER my_buf AS storage KERNEL arg
1248 END)";
1249 
1250   Parser parser;
1251   Result r = parser.Parse(in);
1252   ASSERT_FALSE(r.IsSuccess());
1253   EXPECT_EQ("9: missing ARG_NAME or ARG_NUMBER keyword", r.Error());
1254 }
1255 
TEST_F(AmberScriptParserTest,BindBufferOpenCLMissingArgName)1256 TEST_F(AmberScriptParserTest, BindBufferOpenCLMissingArgName) {
1257   std::string in = R"(
1258 SHADER compute my_shader OPENCL-C
1259 #shader
1260 END
1261 BUFFER my_buf DATA_TYPE uint32 DATA 1 END
1262 
1263 PIPELINE compute my_pipeline
1264   ATTACH my_shader
1265   BIND BUFFER my_buf KERNEL ARG_NAME
1266 END)";
1267 
1268   Parser parser;
1269   Result r = parser.Parse(in);
1270   ASSERT_FALSE(r.IsSuccess());
1271   EXPECT_EQ("10: expected argument identifier", r.Error());
1272 }
1273 
TEST_F(AmberScriptParserTest,BindBufferOpenCLMissingArgNumber)1274 TEST_F(AmberScriptParserTest, BindBufferOpenCLMissingArgNumber) {
1275   std::string in = R"(
1276 SHADER compute my_shader OPENCL-C
1277 #shader
1278 END
1279 BUFFER my_buf DATA_TYPE uint32 DATA 1 END
1280 
1281 PIPELINE compute my_pipeline
1282   ATTACH my_shader
1283   BIND BUFFER my_buf AS storage KERNEL ARG_NUMBER
1284 END)";
1285 
1286   Parser parser;
1287   Result r = parser.Parse(in);
1288   ASSERT_FALSE(r.IsSuccess());
1289   EXPECT_EQ("10: expected argument number", r.Error());
1290 }
1291 
TEST_F(AmberScriptParserTest,BindBufferOpenCLArgNameNotString)1292 TEST_F(AmberScriptParserTest, BindBufferOpenCLArgNameNotString) {
1293   std::string in = R"(
1294 SHADER compute my_shader OPENCL-C
1295 #shader
1296 END
1297 BUFFER my_buf DATA_TYPE uint32 DATA 1 END
1298 
1299 PIPELINE compute my_pipeline
1300   ATTACH my_shader
1301   BIND BUFFER my_buf AS storage KERNEL ARG_NAME 0
1302 END)";
1303 
1304   Parser parser;
1305   Result r = parser.Parse(in);
1306   ASSERT_FALSE(r.IsSuccess());
1307   EXPECT_EQ("9: expected argument identifier", r.Error());
1308 }
1309 
TEST_F(AmberScriptParserTest,BindBufferOpenCLArgNumberNotInteger)1310 TEST_F(AmberScriptParserTest, BindBufferOpenCLArgNumberNotInteger) {
1311   std::string in = R"(
1312 SHADER compute my_shader OPENCL-C
1313 #shader
1314 END
1315 BUFFER my_buf DATA_TYPE uint32 DATA 1 END
1316 
1317 PIPELINE compute my_pipeline
1318   ATTACH my_shader
1319   BIND BUFFER my_buf KERNEL ARG_NUMBER in
1320 END)";
1321 
1322   Parser parser;
1323   Result r = parser.Parse(in);
1324   ASSERT_FALSE(r.IsSuccess());
1325   EXPECT_EQ("9: expected argument number", r.Error());
1326 }
1327 
1328 }  // namespace amberscript
1329 }  // namespace amber
1330