text_advance_test.cpp 3.9 KB

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