1 // Copyright (c) 2015-2016 The Khronos Group 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 <string> 16 17 #include "test/unit_spirv.h" 18 19 namespace spvtools { 20 namespace { 21 22 using spvtest::AutoText; 23 24 TEST(TextAdvance, LeadingNewLines) { 25 AutoText input("\n\nWord"); 26 AssemblyContext data(input, nullptr); 27 ASSERT_EQ(SPV_SUCCESS, data.advance()); 28 ASSERT_EQ(0u, data.position().column); 29 ASSERT_EQ(2u, data.position().line); 30 ASSERT_EQ(2u, data.position().index); 31 } 32 33 TEST(TextAdvance, LeadingSpaces) { 34 AutoText input(" Word"); 35 AssemblyContext data(input, nullptr); 36 ASSERT_EQ(SPV_SUCCESS, data.advance()); 37 ASSERT_EQ(4u, data.position().column); 38 ASSERT_EQ(0u, data.position().line); 39 ASSERT_EQ(4u, data.position().index); 40 } 41 42 TEST(TextAdvance, LeadingTabs) { 43 AutoText input("\t\t\tWord"); 44 AssemblyContext data(input, nullptr); 45 ASSERT_EQ(SPV_SUCCESS, data.advance()); 46 ASSERT_EQ(3u, data.position().column); 47 ASSERT_EQ(0u, data.position().line); 48 ASSERT_EQ(3u, data.position().index); 49 } 50 51 TEST(TextAdvance, LeadingNewLinesSpacesAndTabs) { 52 AutoText input("\n\n\t Word"); 53 AssemblyContext data(input, nullptr); 54 ASSERT_EQ(SPV_SUCCESS, data.advance()); 55 ASSERT_EQ(3u, data.position().column); 56 ASSERT_EQ(2u, data.position().line); 57 ASSERT_EQ(5u, data.position().index); 58 } 59 60 TEST(TextAdvance, LeadingWhitespaceAfterCommentLine) { 61 AutoText input("; comment\n \t \tWord"); 62 AssemblyContext data(input, nullptr); 63 ASSERT_EQ(SPV_SUCCESS, data.advance()); 64 ASSERT_EQ(4u, data.position().column); 65 ASSERT_EQ(1u, data.position().line); 66 ASSERT_EQ(14u, data.position().index); 67 } 68 69 TEST(TextAdvance, EOFAfterCommentLine) { 70 AutoText input("; comment"); 71 AssemblyContext data(input, nullptr); 72 ASSERT_EQ(SPV_END_OF_STREAM, data.advance()); 73 } 74 75 TEST(TextAdvance, NullTerminator) { 76 AutoText input(""); 77 AssemblyContext data(input, nullptr); 78 ASSERT_EQ(SPV_END_OF_STREAM, data.advance()); 79 } 80 81 TEST(TextAdvance, NoNullTerminatorAfterCommentLine) { 82 std::string input = "; comment|padding beyond the end"; 83 spv_text_t text = {input.data(), 9}; 84 AssemblyContext data(&text, nullptr); 85 ASSERT_EQ(SPV_END_OF_STREAM, data.advance()); 86 EXPECT_EQ(9u, data.position().index); 87 } 88 89 TEST(TextAdvance, NoNullTerminator) { 90 spv_text_t text = {"OpNop\nSomething else in memory", 6}; 91 AssemblyContext data(&text, nullptr); 92 const spv_position_t line_break = {1u, 5u, 5u}; 93 data.setPosition(line_break); 94 ASSERT_EQ(SPV_END_OF_STREAM, data.advance()); 95 } 96 97 // Invokes AssemblyContext::advance() on text, asserts success, and returns 98 // AssemblyContext::position(). 99 spv_position_t PositionAfterAdvance(const char* text) { 100 AutoText input(text); 101 AssemblyContext data(input, nullptr); 102 EXPECT_EQ(SPV_SUCCESS, data.advance()); 103 return data.position(); 104 } 105 106 TEST(TextAdvance, SkipOverCR) { 107 const auto pos = PositionAfterAdvance("\rWord"); 108 EXPECT_EQ(1u, pos.column); 109 EXPECT_EQ(0u, pos.line); 110 EXPECT_EQ(1u, pos.index); 111 } 112 113 TEST(TextAdvance, SkipOverCRs) { 114 const auto pos = PositionAfterAdvance("\r\r\rWord"); 115 EXPECT_EQ(3u, pos.column); 116 EXPECT_EQ(0u, pos.line); 117 EXPECT_EQ(3u, pos.index); 118 } 119 120 TEST(TextAdvance, SkipOverCRLF) { 121 const auto pos = PositionAfterAdvance("\r\nWord"); 122 EXPECT_EQ(0u, pos.column); 123 EXPECT_EQ(1u, pos.line); 124 EXPECT_EQ(2u, pos.index); 125 } 126 127 TEST(TextAdvance, SkipOverCRLFs) { 128 const auto pos = PositionAfterAdvance("\r\n\r\nWord"); 129 EXPECT_EQ(0u, pos.column); 130 EXPECT_EQ(2u, pos.line); 131 EXPECT_EQ(4u, pos.index); 132 } 133 } // namespace 134 } // namespace spvtools 135