Home | History | Annotate | Download | only in test
      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