1 // Copyright 2021 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,BlendAllValues)23 TEST_F(AmberScriptParserTest, BlendAllValues) {
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   BIND BUFFER my_fb AS color LOCATION 0
35 
36   BLEND
37     SRC_COLOR_FACTOR src_alpha
38     DST_COLOR_FACTOR one_minus_src_alpha
39     COLOR_OP add
40     SRC_ALPHA_FACTOR one
41     DST_ALPHA_FACTOR zero
42     ALPHA_OP max
43   END
44 END)";
45 
46   Parser parser;
47   Result r = parser.Parse(in);
48   ASSERT_TRUE(r.IsSuccess()) << r.Error();
49 
50   auto script = parser.GetScript();
51   const auto& pipelines = script->GetPipelines();
52   ASSERT_EQ(1U, pipelines.size());
53 
54   auto* pipeline = pipelines[0].get();
55 
56   ASSERT_TRUE(pipeline->GetPipelineData()->GetEnableBlend());
57   ASSERT_EQ(BlendFactor::kSrcAlpha,
58             pipeline->GetPipelineData()->GetSrcColorBlendFactor());
59   ASSERT_EQ(BlendFactor::kOneMinusSrcAlpha,
60             pipeline->GetPipelineData()->GetDstColorBlendFactor());
61   ASSERT_EQ(BlendOp::kAdd,
62             pipeline->GetPipelineData()->GetColorBlendOp());
63 
64   ASSERT_EQ(BlendFactor::kOne,
65             pipeline->GetPipelineData()->GetSrcAlphaBlendFactor());
66   ASSERT_EQ(BlendFactor::kZero,
67             pipeline->GetPipelineData()->GetDstAlphaBlendFactor());
68   ASSERT_EQ(BlendOp::kMax,
69             pipeline->GetPipelineData()->GetAlphaBlendOp());
70 }
71 
TEST_F(AmberScriptParserTest,BlendDefaultValues)72 TEST_F(AmberScriptParserTest, BlendDefaultValues) {
73   std::string in = R"(
74 SHADER vertex my_shader PASSTHROUGH
75 SHADER fragment my_fragment GLSL
76 # GLSL Shader
77 END
78 BUFFER my_fb FORMAT R32G32B32A32_SFLOAT
79 
80 PIPELINE graphics my_pipeline
81   ATTACH my_shader
82   ATTACH my_fragment
83   BIND BUFFER my_fb AS color LOCATION 0
84 
85   BLEND
86   END
87 END)";
88 
89   Parser parser;
90   Result r = parser.Parse(in);
91   ASSERT_TRUE(r.IsSuccess()) << r.Error();
92 
93   auto script = parser.GetScript();
94   const auto& pipelines = script->GetPipelines();
95   ASSERT_EQ(1U, pipelines.size());
96 
97   auto* pipeline = pipelines[0].get();
98 
99   ASSERT_TRUE(pipeline->GetPipelineData()->GetEnableBlend());
100   ASSERT_EQ(BlendFactor::kOne,
101             pipeline->GetPipelineData()->GetSrcColorBlendFactor());
102   ASSERT_EQ(BlendFactor::kZero,
103             pipeline->GetPipelineData()->GetDstColorBlendFactor());
104   ASSERT_EQ(BlendOp::kAdd,
105             pipeline->GetPipelineData()->GetColorBlendOp());
106 
107   ASSERT_EQ(BlendFactor::kOne,
108             pipeline->GetPipelineData()->GetSrcAlphaBlendFactor());
109   ASSERT_EQ(BlendFactor::kZero,
110             pipeline->GetPipelineData()->GetDstAlphaBlendFactor());
111   ASSERT_EQ(BlendOp::kAdd,
112             pipeline->GetPipelineData()->GetAlphaBlendOp());
113 }
114 
TEST_F(AmberScriptParserTest,BlendInvalidColorFactor)115 TEST_F(AmberScriptParserTest, BlendInvalidColorFactor) {
116   std::string in = R"(
117 SHADER vertex my_shader PASSTHROUGH
118 SHADER fragment my_fragment GLSL
119 # GLSL Shader
120 END
121 BUFFER my_fb FORMAT R32G32B32A32_SFLOAT
122 
123 PIPELINE graphics my_pipeline
124   ATTACH my_shader
125   ATTACH my_fragment
126   BIND BUFFER my_fb AS color LOCATION 0
127 
128   BLEND
129     SRC_COLOR_FACTOR foo
130   END
131 END)";
132 
133   Parser parser;
134   Result r = parser.Parse(in);
135   ASSERT_FALSE(r.IsSuccess()) << r.Error();
136   EXPECT_EQ("14: BLEND invalid value for SRC_COLOR_FACTOR: foo", r.Error());
137 }
138 
139 }  // namespace amberscript
140 }  // namespace amber
141