spirv-reader: validity for user name tests

Bug: tint:765
Change-Id: Iad711d911137e2f66be28ac8238389f5b68c1d20
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/50020
Commit-Queue: David Neto <dneto@google.com>
Kokoro: Kokoro <noreply+kokoro@google.com>
Reviewed-by: Alan Baker <alanbaker@google.com>
diff --git a/src/reader/spirv/parser_impl_user_name_test.cc b/src/reader/spirv/parser_impl_user_name_test.cc
index f69be61..258fd63 100644
--- a/src/reader/spirv/parser_impl_user_name_test.cc
+++ b/src/reader/spirv/parser_impl_user_name_test.cc
@@ -23,25 +23,31 @@
 
 using ::testing::Eq;
 
-TEST_F(SpvParserTest, UserName_RespectOpName) {
+using SpvParserUserNameTest = SpvParserTest;
+
+TEST_F(SpvParserUserNameTest, UserName_RespectOpName) {
   auto p = parser(test::Assemble(R"(
      OpName %1 "the_void_type"
      %1 = OpTypeVoid
   )"));
   EXPECT_TRUE(p->BuildAndParseInternalModule());
   EXPECT_THAT(p->namer().GetName(1), Eq("the_void_type"));
+
+  p->DeliberatelyInvalidSpirv();
 }
 
-TEST_F(SpvParserTest, UserName_IgnoreEmptyName) {
+TEST_F(SpvParserUserNameTest, UserName_IgnoreEmptyName) {
   auto p = parser(test::Assemble(R"(
      OpName %1 ""
      %1 = OpTypeVoid
   )"));
   EXPECT_TRUE(p->BuildAndParseInternalModule());
   EXPECT_FALSE(p->namer().HasName(1));
+
+  p->DeliberatelyInvalidSpirv();
 }
 
-TEST_F(SpvParserTest, UserName_DistinguishDuplicateSuggestion) {
+TEST_F(SpvParserUserNameTest, UserName_DistinguishDuplicateSuggestion) {
   auto p = parser(test::Assemble(R"(
      OpName %1 "vanilla"
      OpName %2 "vanilla"
@@ -51,9 +57,11 @@
   EXPECT_TRUE(p->BuildAndParseInternalModule());
   EXPECT_THAT(p->namer().GetName(1), Eq("vanilla"));
   EXPECT_THAT(p->namer().GetName(2), Eq("vanilla_1"));
+
+  p->DeliberatelyInvalidSpirv();
 }
 
-TEST_F(SpvParserTest, UserName_RespectOpMemberName) {
+TEST_F(SpvParserUserNameTest, UserName_RespectOpMemberName) {
   auto p = parser(test::Assemble(R"(
      OpMemberName %3 0 "strawberry"
      OpMemberName %3 1 "vanilla"
@@ -65,9 +73,11 @@
   EXPECT_THAT(p->namer().GetMemberName(3, 0), Eq("strawberry"));
   EXPECT_THAT(p->namer().GetMemberName(3, 1), Eq("vanilla"));
   EXPECT_THAT(p->namer().GetMemberName(3, 2), Eq("chocolate"));
+
+  p->DeliberatelyInvalidSpirv();
 }
 
-TEST_F(SpvParserTest, UserName_IgnoreEmptyMemberName) {
+TEST_F(SpvParserUserNameTest, UserName_IgnoreEmptyMemberName) {
   auto p = parser(test::Assemble(R"(
      OpMemberName %3 0 ""
      %2 = OpTypeInt 32 0
@@ -75,9 +85,11 @@
   )"));
   EXPECT_TRUE(p->BuildAndParseInternalModule());
   EXPECT_THAT(p->namer().GetMemberName(3, 0), Eq("field0"));
+
+  p->DeliberatelyInvalidSpirv();
 }
 
-TEST_F(SpvParserTest, UserName_SynthesizeMemberNames) {
+TEST_F(SpvParserUserNameTest, UserName_SynthesizeMemberNames) {
   auto p = parser(test::Assemble(R"(
      %2 = OpTypeInt 32 0
      %3 = OpTypeStruct %2 %2 %2
@@ -86,9 +98,11 @@
   EXPECT_THAT(p->namer().GetMemberName(3, 0), Eq("field0"));
   EXPECT_THAT(p->namer().GetMemberName(3, 1), Eq("field1"));
   EXPECT_THAT(p->namer().GetMemberName(3, 2), Eq("field2"));
+
+  p->DeliberatelyInvalidSpirv();
 }
 
-TEST_F(SpvParserTest, UserName_MemberNamesMixUserAndSynthesized) {
+TEST_F(SpvParserUserNameTest, UserName_MemberNamesMixUserAndSynthesized) {
   auto p = parser(test::Assemble(R"(
      OpMemberName %3 1 "vanilla"
      %2 = OpTypeInt 32 0
@@ -98,14 +112,17 @@
   EXPECT_THAT(p->namer().GetMemberName(3, 0), Eq("field0"));
   EXPECT_THAT(p->namer().GetMemberName(3, 1), Eq("vanilla"));
   EXPECT_THAT(p->namer().GetMemberName(3, 2), Eq("field2"));
+
+  p->DeliberatelyInvalidSpirv();
 }
 
-TEST_F(SpvParserTest, EntryPointNames_AlwaysTakePrecedence) {
+TEST_F(SpvParserUserNameTest, EntryPointNames_AlwaysTakePrecedence) {
   const std::string assembly = R"(
    OpCapability Shader
    OpMemoryModel Logical Simple
-   OpEntryPoint GLCompute %100 "main"
+   OpEntryPoint Vertex %100 "main"
    OpEntryPoint Fragment %100 "main_1"
+   OpExecutionMode %100 OriginUpperLeft
 
    ; attempt to grab the "main_1" that would be the derived name
    ; for the second entry point.
@@ -134,14 +151,23 @@
   ASSERT_EQ(2u, ep_info.size());
   EXPECT_EQ(ep_info[0].name, "main");
   EXPECT_EQ(ep_info[1].name, "main_1");
+
+  // This test checks two entry point with the same implementation function.
+  // But for the shader stages supported by WGSL, the SPIR-V rules require
+  // conflicting execution modes be applied to them.
+  // I still want to test the name disambiguation behaviour, but the cases
+  // are rejected by SPIR-V validation. This is true at least for the current
+  // WGSL feature set.
+  p->DeliberatelyInvalidSpirv();
 }
 
-TEST_F(SpvParserTest, EntryPointNames_DistinctFromInnerNames) {
+TEST_F(SpvParserUserNameTest, EntryPointNames_DistinctFromInnerNames) {
   const std::string assembly = R"(
    OpCapability Shader
    OpMemoryModel Logical Simple
-   OpEntryPoint GLCompute %100 "main"
+   OpEntryPoint Vertex %100 "main"
    OpEntryPoint Fragment %100 "main_1"
+   OpExecutionMode %100 OriginUpperLeft
 
    ; attempt to grab the "main_1" that would be the derived name
    ; for the second entry point.
@@ -176,6 +202,14 @@
   EXPECT_EQ(ep_info[1].name, "main_1");
   // ...but will use the same implementation function.
   EXPECT_EQ(ep_info[1].inner_name, "main_2");
+
+  // This test checks two entry point with the same implementation function.
+  // But for the shader stages supported by WGSL, the SPIR-V rules require
+  // conflicting execution modes be applied to them.
+  // I still want to test the name disambiguation behaviour, but the cases
+  // are rejected by SPIR-V validation. This is true at least for the current
+  // WGSL feature set.
+  p->DeliberatelyInvalidSpirv();
 }
 
 }  // namespace