|  | // 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 <string> | 
|  |  | 
|  | #include "test/unit_spirv.h" | 
|  |  | 
|  | namespace spvtools { | 
|  | namespace { | 
|  |  | 
|  | using spvtest::AutoText; | 
|  |  | 
|  | TEST(TextAdvance, LeadingNewLines) { | 
|  | AutoText input("\n\nWord"); | 
|  | AssemblyContext data(input, nullptr); | 
|  | ASSERT_EQ(SPV_SUCCESS, data.advance()); | 
|  | ASSERT_EQ(0u, data.position().column); | 
|  | ASSERT_EQ(2u, data.position().line); | 
|  | ASSERT_EQ(2u, data.position().index); | 
|  | } | 
|  |  | 
|  | TEST(TextAdvance, LeadingSpaces) { | 
|  | AutoText input("    Word"); | 
|  | AssemblyContext data(input, nullptr); | 
|  | ASSERT_EQ(SPV_SUCCESS, data.advance()); | 
|  | ASSERT_EQ(4u, data.position().column); | 
|  | ASSERT_EQ(0u, data.position().line); | 
|  | ASSERT_EQ(4u, data.position().index); | 
|  | } | 
|  |  | 
|  | TEST(TextAdvance, LeadingTabs) { | 
|  | AutoText input("\t\t\tWord"); | 
|  | AssemblyContext data(input, nullptr); | 
|  | ASSERT_EQ(SPV_SUCCESS, data.advance()); | 
|  | ASSERT_EQ(3u, data.position().column); | 
|  | ASSERT_EQ(0u, data.position().line); | 
|  | ASSERT_EQ(3u, data.position().index); | 
|  | } | 
|  |  | 
|  | TEST(TextAdvance, LeadingNewLinesSpacesAndTabs) { | 
|  | AutoText input("\n\n\t  Word"); | 
|  | AssemblyContext data(input, nullptr); | 
|  | ASSERT_EQ(SPV_SUCCESS, data.advance()); | 
|  | ASSERT_EQ(3u, data.position().column); | 
|  | ASSERT_EQ(2u, data.position().line); | 
|  | ASSERT_EQ(5u, data.position().index); | 
|  | } | 
|  |  | 
|  | TEST(TextAdvance, LeadingWhitespaceAfterCommentLine) { | 
|  | AutoText input("; comment\n \t \tWord"); | 
|  | AssemblyContext data(input, nullptr); | 
|  | ASSERT_EQ(SPV_SUCCESS, data.advance()); | 
|  | ASSERT_EQ(4u, data.position().column); | 
|  | ASSERT_EQ(1u, data.position().line); | 
|  | ASSERT_EQ(14u, data.position().index); | 
|  | } | 
|  |  | 
|  | TEST(TextAdvance, EOFAfterCommentLine) { | 
|  | AutoText input("; comment"); | 
|  | AssemblyContext data(input, nullptr); | 
|  | ASSERT_EQ(SPV_END_OF_STREAM, data.advance()); | 
|  | } | 
|  |  | 
|  | TEST(TextAdvance, NullTerminator) { | 
|  | AutoText input(""); | 
|  | AssemblyContext data(input, nullptr); | 
|  | ASSERT_EQ(SPV_END_OF_STREAM, data.advance()); | 
|  | } | 
|  |  | 
|  | TEST(TextAdvance, NoNullTerminatorAfterCommentLine) { | 
|  | std::string input = "; comment|padding beyond the end"; | 
|  | spv_text_t text = {input.data(), 9}; | 
|  | AssemblyContext data(&text, nullptr); | 
|  | ASSERT_EQ(SPV_END_OF_STREAM, data.advance()); | 
|  | EXPECT_EQ(9u, data.position().index); | 
|  | } | 
|  |  | 
|  | TEST(TextAdvance, NoNullTerminator) { | 
|  | spv_text_t text = {"OpNop\nSomething else in memory", 6}; | 
|  | AssemblyContext data(&text, nullptr); | 
|  | const spv_position_t line_break = {1u, 5u, 5u}; | 
|  | data.setPosition(line_break); | 
|  | ASSERT_EQ(SPV_END_OF_STREAM, data.advance()); | 
|  | } | 
|  |  | 
|  | // Invokes AssemblyContext::advance() on text, asserts success, and returns | 
|  | // AssemblyContext::position(). | 
|  | spv_position_t PositionAfterAdvance(const char* text) { | 
|  | AutoText input(text); | 
|  | AssemblyContext data(input, nullptr); | 
|  | EXPECT_EQ(SPV_SUCCESS, data.advance()); | 
|  | return data.position(); | 
|  | } | 
|  |  | 
|  | TEST(TextAdvance, SkipOverCR) { | 
|  | const auto pos = PositionAfterAdvance("\rWord"); | 
|  | EXPECT_EQ(1u, pos.column); | 
|  | EXPECT_EQ(0u, pos.line); | 
|  | EXPECT_EQ(1u, pos.index); | 
|  | } | 
|  |  | 
|  | TEST(TextAdvance, SkipOverCRs) { | 
|  | const auto pos = PositionAfterAdvance("\r\r\rWord"); | 
|  | EXPECT_EQ(3u, pos.column); | 
|  | EXPECT_EQ(0u, pos.line); | 
|  | EXPECT_EQ(3u, pos.index); | 
|  | } | 
|  |  | 
|  | TEST(TextAdvance, SkipOverCRLF) { | 
|  | const auto pos = PositionAfterAdvance("\r\nWord"); | 
|  | EXPECT_EQ(0u, pos.column); | 
|  | EXPECT_EQ(1u, pos.line); | 
|  | EXPECT_EQ(2u, pos.index); | 
|  | } | 
|  |  | 
|  | TEST(TextAdvance, SkipOverCRLFs) { | 
|  | const auto pos = PositionAfterAdvance("\r\n\r\nWord"); | 
|  | EXPECT_EQ(0u, pos.column); | 
|  | EXPECT_EQ(2u, pos.line); | 
|  | EXPECT_EQ(4u, pos.index); | 
|  | } | 
|  | }  // namespace | 
|  | }  // namespace spvtools |