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