From: David Neto Date: Mon, 28 Sep 2015 19:02:21 +0000 (-0400) Subject: Assembly test for OpSwitch X-Git-Tag: upstream/2018.6~1511^2~75 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=42bfd4bfab1272c79983506a44922682577c7a51;p=platform%2Fupstream%2FSPIRV-Tools.git Assembly test for OpSwitch Removes old weak and fragile tests for OpSwitch. Adds spvtest::TextToBinaryTest::CompileWithFormatFailure --- diff --git a/test/TestFixture.h b/test/TestFixture.h index 7bb5a85..cb03d58 100644 --- a/test/TestFixture.h +++ b/test/TestFixture.h @@ -84,17 +84,25 @@ class TextToBinaryTestBase : public T { return code_copy; } - // Compiles SPIR-V text, asserting compilation failure. Returns the error - // message(s). - std::string CompileFailure(const std::string& text) { + // Compiles SPIR-V text with the given format, asserting compilation failure. + // Returns the error message(s). + std::string CompileWithFormatFailure(const std::string& text, + spv_assembly_syntax_format_t format) { EXPECT_NE(SPV_SUCCESS, - spvTextToBinary(text.c_str(), text.size(), opcodeTable, - operandTable, extInstTable, &binary, &diagnostic)) + spvTextWithFormatToBinary(text.c_str(), text.size(), format, + opcodeTable, operandTable, extInstTable, + &binary, &diagnostic)) << text; DestroyBinary(); return diagnostic->error; } + // Compiles SPIR-V text using the default format, asserting compilation failure. + // Returns the error message(s). + std::string CompileFailure(const std::string& text) { + return CompileWithFormatFailure(text, SPV_ASSEMBLY_SYNTAX_FORMAT_DEFAULT); + } + // Encodes SPIR-V text into binary and then decodes the binary. Returns the // decoded text. std::string EncodeAndDecodeSuccessfully(const std::string& text) { diff --git a/test/TextToBinary.ControlFlow.cpp b/test/TextToBinary.ControlFlow.cpp index e95fb46..762f029 100644 --- a/test/TextToBinary.ControlFlow.cpp +++ b/test/TextToBinary.ControlFlow.cpp @@ -35,6 +35,7 @@ namespace { using spvtest::MakeInstruction; +using spvtest::TextToBinaryTest; using ::testing::Eq; // Test OpSelectionMerge @@ -99,6 +100,66 @@ TEST_F(OpLoopMergeTest, CombinedLoopControlMask) { Eq(MakeInstruction(spv::OpLoopMerge, {1, 2, expected_mask}))); } +// Test OpSwitch + +TEST_F(TextToBinaryTest, SwitchGoodZeroTargets) { + EXPECT_THAT(CompiledInstructions("OpSwitch %selector %default"), + Eq(MakeInstruction(spv::OpSwitch, {1, 2}))); +} + +TEST_F(TextToBinaryTest, SwitchGoodOneTarget) { + EXPECT_THAT(CompiledInstructions("OpSwitch %selector %default 12 %target0"), + Eq(MakeInstruction(spv::OpSwitch, {1, 2, 12, 3}))); +} + +TEST_F(TextToBinaryTest, SwitchGoodTwoTargets) { + EXPECT_THAT(CompiledInstructions( + "OpSwitch %selector %default 12 %target0 42 %target1"), + Eq(MakeInstruction(spv::OpSwitch, {1, 2, 12, 3, 42, 4}))); +} + +TEST_F(TextToBinaryTest, SwitchBadMissingSelector) { + EXPECT_THAT(CompileFailure("OpSwitch"), + Eq("Expected operand, found end of stream.")); +} + +TEST_F(TextToBinaryTest, SwitchBadInvalidSelector) { + EXPECT_THAT(CompileFailure("OpSwitch 12"), + Eq("Expected id to start with %.")); +} + +TEST_F(TextToBinaryTest, SwitchBadMissingDefault) { + EXPECT_THAT(CompileFailure("OpSwitch %selector"), + Eq("Expected operand, found end of stream.")); +} + +TEST_F(TextToBinaryTest, SwitchBadInvalidDefault) { + EXPECT_THAT(CompileFailure("OpSwitch %selector 12"), + Eq("Expected id to start with %.")); +} + +TEST_F(TextToBinaryTest, SwitchBadInvalidLiteralDefaultFormat) { + // The assembler recognizes "OpSwitch %selector %default" as a complete + // instruction. Then it tries to parse "%abc" as the start of an + // assignment form instruction, but can't since it hits the end + // of stream. + EXPECT_THAT(CompileFailure("OpSwitch %selector %default %abc"), + Eq("Expected '=', found end of stream.")); +} + +TEST_F(TextToBinaryTest, SwitchBadInvalidLiteralCanonicalFormat) { + EXPECT_THAT(CompileWithFormatFailure("OpSwitch %selector %default %abc", + SPV_ASSEMBLY_SYNTAX_FORMAT_CANONICAL), + Eq("Expected at the beginning of an instruction, found " + "'%abc'.")); +} + +TEST_F(TextToBinaryTest, SwitchBadMissingTarget) { + EXPECT_THAT(CompileFailure("OpSwitch %selector %default 12"), + Eq("Expected operand, found end of stream.")); +} + + // TODO(dneto): OpPhi // TODO(dneto): OpLoopMerge // TODO(dneto): OpLabel diff --git a/test/TextToBinary.cpp b/test/TextToBinary.cpp index 6f65241..e7f0e0c 100644 --- a/test/TextToBinary.cpp +++ b/test/TextToBinary.cpp @@ -420,55 +420,6 @@ TEST_F(TextToBinaryTest, WrongOpCode) { EXPECT_STREQ("Invalid Opcode prefix 'Wahahaha'.", diagnostic->error); } -TEST_F(TextToBinaryTest, GoodSwitch) { - const SpirvVector code = CompileSuccessfully(R"( -%i32 = OpTypeInt 32 0 -%fortytwo = OpConstant %i32 42 -%twelve = OpConstant %i32 12 -%entry = OpLabel - OpSwitch %fortytwo %default 42 %go42 12 %go12 -%go42 = OpLabel - OpBranch %default -%go12 = OpLabel - OpBranch %default -%default = OpLabel -)"); - - // Minimal check: The OpSwitch opcode word is correct. - EXPECT_EQ((int(spv::OpSwitch) | (7 << 16)), code[14 + SPV_INDEX_INSTRUCTION]); -} - -TEST_F(TextToBinaryTest, GoodSwitchZeroCasesOneDefault) { - const SpirvVector code = CompileSuccessfully(R"( -%i32 = OpTypeInt 32 0 -%fortytwo = OpConstant %i32 42 -%entry = OpLabel - OpSwitch %fortytwo %default -%default = OpLabel -)"); - - // Minimal check: The OpSwitch opcode word is correct. - EXPECT_EQ((int(spv::OpSwitch) | (3 << 16)), code[10 + SPV_INDEX_INSTRUCTION]); -} - -TEST_F(TextToBinaryTest, BadSwitchTruncatedCase) { - SetText(R"( -%i32 = OpTypeInt 32 0 -%fortytwo = OpConstant %i32 42 -%entry = OpLabel - OpSwitch %fortytwo %default 42 ; missing target! -%default = OpLabel -)"); - - EXPECT_EQ(SPV_ERROR_INVALID_TEXT, - spvTextToBinary(text.str, text.length, opcodeTable, operandTable, - extInstTable, &binary, &diagnostic)); - EXPECT_EQ(6, diagnostic->position.line + 1); - EXPECT_EQ(1, diagnostic->position.column + 1); - EXPECT_STREQ("Expected operand, found next instruction instead.", - diagnostic->error); -} - using TextToBinaryFloatValueTest = spvtest::TextToBinaryTestBase< ::testing::TestWithParam>>;