1// Copyright (c) 2016 Google Inc.
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 "gmock/gmock.h"
16#include "test/test_fixture.h"
17
18namespace spvtools {
19namespace {
20
21using ::spvtest::MakeInstruction;
22using ::testing::Eq;
23
24using OpTypePipeStorageTest = spvtest::TextToBinaryTest;
25
26// It can assemble, but should not validate.  Validation checks for version
27// and capability are in another test file.
28TEST_F(OpTypePipeStorageTest, OpcodeAssemblesInV10) {
29  EXPECT_THAT(
30      CompiledInstructions("%res = OpTypePipeStorage", SPV_ENV_UNIVERSAL_1_0),
31      Eq(MakeInstruction(spv::Op::OpTypePipeStorage, {1})));
32}
33
34TEST_F(OpTypePipeStorageTest, ArgumentCount) {
35  EXPECT_THAT(
36      CompileFailure("OpTypePipeStorage", SPV_ENV_UNIVERSAL_1_1),
37      Eq("Expected <result-id> at the beginning of an instruction, found "
38         "'OpTypePipeStorage'."));
39  EXPECT_THAT(
40      CompiledInstructions("%res = OpTypePipeStorage", SPV_ENV_UNIVERSAL_1_1),
41      Eq(MakeInstruction(spv::Op::OpTypePipeStorage, {1})));
42  EXPECT_THAT(CompileFailure("%res = OpTypePipeStorage %1 %2 %3 %4 %5",
43                             SPV_ENV_UNIVERSAL_1_1),
44              Eq("'=' expected after result id but found '%2'."));
45}
46
47using OpConstantPipeStorageTest = spvtest::TextToBinaryTest;
48
49TEST_F(OpConstantPipeStorageTest, OpcodeAssemblesInV10) {
50  EXPECT_THAT(
51      CompiledInstructions("%1 = OpConstantPipeStorage %2 3 4 5",
52                           SPV_ENV_UNIVERSAL_1_0),
53      Eq(MakeInstruction(spv::Op::OpConstantPipeStorage, {1, 2, 3, 4, 5})));
54}
55
56TEST_F(OpConstantPipeStorageTest, ArgumentCount) {
57  EXPECT_THAT(
58      CompileFailure("OpConstantPipeStorage", SPV_ENV_UNIVERSAL_1_1),
59      Eq("Expected <result-id> at the beginning of an instruction, found "
60         "'OpConstantPipeStorage'."));
61  EXPECT_THAT(
62      CompileFailure("%1 = OpConstantPipeStorage", SPV_ENV_UNIVERSAL_1_1),
63      Eq("Expected operand for OpConstantPipeStorage instruction, but found "
64         "the end of the stream."));
65  EXPECT_THAT(CompileFailure("%1 = OpConstantPipeStorage %2 3 4",
66                             SPV_ENV_UNIVERSAL_1_1),
67              Eq("Expected operand for OpConstantPipeStorage instruction, but "
68                 "found the end of the stream."));
69  EXPECT_THAT(
70      CompiledInstructions("%1 = OpConstantPipeStorage %2 3 4 5",
71                           SPV_ENV_UNIVERSAL_1_1),
72      Eq(MakeInstruction(spv::Op::OpConstantPipeStorage, {1, 2, 3, 4, 5})));
73  EXPECT_THAT(CompileFailure("%1 = OpConstantPipeStorage %2 3 4 5 %6 %7",
74                             SPV_ENV_UNIVERSAL_1_1),
75              Eq("'=' expected after result id but found '%7'."));
76}
77
78TEST_F(OpConstantPipeStorageTest, ArgumentTypes) {
79  EXPECT_THAT(CompileFailure("%1 = OpConstantPipeStorage %2 %3 4 5",
80                             SPV_ENV_UNIVERSAL_1_1),
81              Eq("Invalid unsigned integer literal: %3"));
82  EXPECT_THAT(CompileFailure("%1 = OpConstantPipeStorage %2 3 %4 5",
83                             SPV_ENV_UNIVERSAL_1_1),
84              Eq("Invalid unsigned integer literal: %4"));
85  EXPECT_THAT(CompileFailure("%1 = OpConstantPipeStorage 2 3 4 5",
86                             SPV_ENV_UNIVERSAL_1_1),
87              Eq("Expected id to start with %."));
88  EXPECT_THAT(CompileFailure("%1 = OpConstantPipeStorage %2 3 4 \"ab\"",
89                             SPV_ENV_UNIVERSAL_1_1),
90              Eq("Invalid unsigned integer literal: \"ab\""));
91}
92
93using OpCreatePipeFromPipeStorageTest = spvtest::TextToBinaryTest;
94
95TEST_F(OpCreatePipeFromPipeStorageTest, OpcodeAssemblesInV10) {
96  EXPECT_THAT(
97      CompiledInstructions("%1 = OpCreatePipeFromPipeStorage %2 %3",
98                           SPV_ENV_UNIVERSAL_1_0),
99      Eq(MakeInstruction(spv::Op::OpCreatePipeFromPipeStorage, {1, 2, 3})));
100}
101
102TEST_F(OpCreatePipeFromPipeStorageTest, ArgumentCount) {
103  EXPECT_THAT(
104      CompileFailure("OpCreatePipeFromPipeStorage", SPV_ENV_UNIVERSAL_1_1),
105      Eq("Expected <result-id> at the beginning of an instruction, found "
106         "'OpCreatePipeFromPipeStorage'."));
107  EXPECT_THAT(
108      CompileFailure("%1 = OpCreatePipeFromPipeStorage", SPV_ENV_UNIVERSAL_1_1),
109      Eq("Expected operand for OpCreatePipeFromPipeStorage instruction, but "
110         "found the end of the stream."));
111  EXPECT_THAT(CompileFailure("%1 = OpCreatePipeFromPipeStorage %2 OpNop",
112                             SPV_ENV_UNIVERSAL_1_1),
113              Eq("Expected operand for OpCreatePipeFromPipeStorage "
114                 "instruction, but found the next instruction instead."));
115  EXPECT_THAT(
116      CompiledInstructions("%1 = OpCreatePipeFromPipeStorage %2 %3",
117                           SPV_ENV_UNIVERSAL_1_1),
118      Eq(MakeInstruction(spv::Op::OpCreatePipeFromPipeStorage, {1, 2, 3})));
119  EXPECT_THAT(CompileFailure("%1 = OpCreatePipeFromPipeStorage %2 %3 %4 %5",
120                             SPV_ENV_UNIVERSAL_1_1),
121              Eq("'=' expected after result id but found '%5'."));
122}
123
124TEST_F(OpCreatePipeFromPipeStorageTest, ArgumentTypes) {
125  EXPECT_THAT(CompileFailure("%1 = OpCreatePipeFromPipeStorage \"\" %3",
126                             SPV_ENV_UNIVERSAL_1_1),
127              Eq("Expected id to start with %."));
128  EXPECT_THAT(CompileFailure("%1 = OpCreatePipeFromPipeStorage %2 3",
129                             SPV_ENV_UNIVERSAL_1_1),
130              Eq("Expected id to start with %."));
131}
132
133}  // namespace
134}  // namespace spvtools
135