1 // Copyright (c) 2017 Pierre Moreau
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 implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14
15 #include <string>
16
17 #include "gmock/gmock.h"
18 #include "test/link/linker_fixture.h"
19
20 namespace spvtools {
21 namespace {
22
23 using ::testing::HasSubstr;
24
25 class EntryPoints : public spvtest::LinkerTest {};
26
TEST_F(EntryPoints,SameModelDifferentName)27 TEST_F(EntryPoints, SameModelDifferentName) {
28 const std::string body1 = R"(
29 OpEntryPoint GLCompute %3 "foo"
30 %1 = OpTypeVoid
31 %2 = OpTypeFunction %1
32 %3 = OpFunction %1 None %2
33 OpFunctionEnd
34 )";
35 const std::string body2 = R"(
36 OpEntryPoint GLCompute %3 "bar"
37 %1 = OpTypeVoid
38 %2 = OpTypeFunction %1
39 %3 = OpFunction %1 None %2
40 OpFunctionEnd
41 )";
42
43 spvtest::Binary linked_binary;
44 EXPECT_EQ(SPV_SUCCESS, AssembleAndLink({body1, body2}, &linked_binary));
45 EXPECT_THAT(GetErrorMessage(), std::string());
46 }
47
TEST_F(EntryPoints,DifferentModelSameName)48 TEST_F(EntryPoints, DifferentModelSameName) {
49 const std::string body1 = R"(
50 OpEntryPoint GLCompute %3 "foo"
51 %1 = OpTypeVoid
52 %2 = OpTypeFunction %1
53 %3 = OpFunction %1 None %2
54 OpFunctionEnd
55 )";
56 const std::string body2 = R"(
57 OpEntryPoint Vertex %3 "foo"
58 %1 = OpTypeVoid
59 %2 = OpTypeFunction %1
60 %3 = OpFunction %1 None %2
61 OpFunctionEnd
62 )";
63
64 spvtest::Binary linked_binary;
65 EXPECT_EQ(SPV_SUCCESS, AssembleAndLink({body1, body2}, &linked_binary));
66 EXPECT_THAT(GetErrorMessage(), std::string());
67 }
68
TEST_F(EntryPoints,SameModelAndName)69 TEST_F(EntryPoints, SameModelAndName) {
70 const std::string body1 = R"(
71 OpEntryPoint GLCompute %3 "foo"
72 %1 = OpTypeVoid
73 %2 = OpTypeFunction %1
74 %3 = OpFunction %1 None %2
75 OpFunctionEnd
76 )";
77 const std::string body2 = R"(
78 OpEntryPoint GLCompute %3 "foo"
79 %1 = OpTypeVoid
80 %2 = OpTypeFunction %1
81 %3 = OpFunction %1 None %2
82 OpFunctionEnd
83 )";
84
85 spvtest::Binary linked_binary;
86 EXPECT_EQ(SPV_ERROR_INTERNAL,
87 AssembleAndLink({body1, body2}, &linked_binary));
88 EXPECT_THAT(GetErrorMessage(),
89 HasSubstr("The entry point \"foo\", with execution model "
90 "GLCompute, was already defined."));
91 }
92
93 } // namespace
94 } // namespace spvtools
95