| // Copyright (c) 2015-2016 The Khronos Group Inc. | 
 | // | 
 | // Licensed under the Apache License, Version 2.0 (the "License"); | 
 | // you may not use this file except in compliance with the License. | 
 | // You may obtain a copy of the License at | 
 | // | 
 | //     http://www.apache.org/licenses/LICENSE-2.0 | 
 | // | 
 | // Unless required by applicable law or agreed to in writing, software | 
 | // distributed under the License is distributed on an "AS IS" BASIS, | 
 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
 | // See the License for the specific language governing permissions and | 
 | // limitations under the License. | 
 |  | 
 | #include <vector> | 
 |  | 
 | #include "test_fixture.h" | 
 | #include "unit_spirv.h" | 
 |  | 
 | namespace { | 
 |  | 
 | using NamedIdTest = spvtest::TextToBinaryTest; | 
 |  | 
 | TEST_F(NamedIdTest, Default) { | 
 |   const std::string input = R"( | 
 |           OpCapability Shader | 
 |           OpMemoryModel Logical Simple | 
 |           OpEntryPoint Vertex %main "foo" | 
 |   %void = OpTypeVoid | 
 | %fnMain = OpTypeFunction %void | 
 |   %main = OpFunction %void None %fnMain | 
 | %lbMain = OpLabel | 
 |           OpReturn | 
 |           OpFunctionEnd)"; | 
 |   const std::string output = | 
 |       "OpCapability Shader\n" | 
 |       "OpMemoryModel Logical Simple\n" | 
 |       "OpEntryPoint Vertex %1 \"foo\"\n" | 
 |       "%2 = OpTypeVoid\n" | 
 |       "%3 = OpTypeFunction %2\n" | 
 |       "%1 = OpFunction %2 None %3\n" | 
 |       "%4 = OpLabel\n" | 
 |       "OpReturn\n" | 
 |       "OpFunctionEnd\n"; | 
 |   EXPECT_EQ(output, EncodeAndDecodeSuccessfully(input)); | 
 | } | 
 |  | 
 | struct IdCheckCase { | 
 |   std::string id; | 
 |   bool valid; | 
 | }; | 
 |  | 
 | using IdValidityTest = | 
 |     spvtest::TextToBinaryTestBase<::testing::TestWithParam<IdCheckCase>>; | 
 |  | 
 | TEST_P(IdValidityTest, IdTypes) { | 
 |   const std::string input = GetParam().id + " = OpTypeVoid"; | 
 |   SetText(input); | 
 |   if (GetParam().valid) { | 
 |     CompileSuccessfully(input); | 
 |   } else { | 
 |     CompileFailure(input); | 
 |   } | 
 | } | 
 |  | 
 | INSTANTIATE_TEST_CASE_P( | 
 |     ValidAndInvalidIds, IdValidityTest, | 
 |     ::testing::ValuesIn(std::vector<IdCheckCase>({{"%1", true}, | 
 |                                                   {"%2abc", true}, | 
 |                                                   {"%3Def", true}, | 
 |                                                   {"%4GHI", true}, | 
 |                                                   {"%5_j_k", true}, | 
 |                                                   {"%6J_M", true}, | 
 |                                                   {"%n", true}, | 
 |                                                   {"%O", true}, | 
 |                                                   {"%p7", true}, | 
 |                                                   {"%Q8", true}, | 
 |                                                   {"%R_S", true}, | 
 |                                                   {"%T_10_U", true}, | 
 |                                                   {"%V_11", true}, | 
 |                                                   {"%W_X_13", true}, | 
 |                                                   {"%_A", true}, | 
 |                                                   {"%_", true}, | 
 |                                                   {"%__", true}, | 
 |                                                   {"%A_", true}, | 
 |                                                   {"%_A_", true}, | 
 |  | 
 |                                                   {"%@", false}, | 
 |                                                   {"%!", false}, | 
 |                                                   {"%ABC!", false}, | 
 |                                                   {"%__A__@", false}, | 
 |                                                   {"%%", false}, | 
 |                                                   {"%-", false}, | 
 |                                                   {"%foo_@_bar", false}, | 
 |                                                   {"%", false}, | 
 |  | 
 |                                                   {"5", false}, | 
 |                                                   {"32", false}, | 
 |                                                   {"foo", false}, | 
 |                                                   {"a%bar", false}})),); | 
 |  | 
 | }  // anonymous namespace |