PageRenderTime 36ms CodeModel.GetById 24ms RepoModel.GetById 1ms app.codeStats 0ms

/mordor/tests/memory_stream.cpp

http://github.com/mozy/mordor
C++ | 178 lines | 165 code | 11 blank | 2 comment | 60 complexity | c213cb7d4665e6ee20fd7748405c8fc3 MD5 | raw file
Possible License(s): BSD-3-Clause
  1. // Copyright (c) 2009 - Mozy, Inc.
  2. #include "mordor/streams/memory.h"
  3. #include "mordor/version.h"
  4. #include "mordor/test/test.h"
  5. using namespace Mordor;
  6. using namespace Mordor::Test;
  7. MORDOR_UNITTEST(MemoryStream, basic)
  8. {
  9. MemoryStream stream;
  10. Buffer buffer;
  11. MORDOR_TEST_ASSERT_EQUAL(stream.size(), 0);
  12. MORDOR_TEST_ASSERT_EQUAL(stream.tell(), 0);
  13. MORDOR_TEST_ASSERT_EQUAL(stream.write("cody", 4), 4u);
  14. MORDOR_TEST_ASSERT_EQUAL(stream.size(), 4);
  15. MORDOR_TEST_ASSERT_EQUAL(stream.tell(), 4);
  16. MORDOR_TEST_ASSERT(stream.buffer() == "cody");
  17. MORDOR_TEST_ASSERT(stream.readBuffer() == "");
  18. MORDOR_TEST_ASSERT_EQUAL(stream.seek(0, Stream::BEGIN), 0);
  19. MORDOR_TEST_ASSERT_EQUAL(stream.tell(), 0);
  20. MORDOR_TEST_ASSERT(stream.buffer() == "cody");
  21. MORDOR_TEST_ASSERT(stream.readBuffer() == "cody");
  22. MORDOR_TEST_ASSERT_EQUAL(stream.read(buffer, 2), 2u);
  23. MORDOR_TEST_ASSERT_EQUAL(stream.size(), 4);
  24. MORDOR_TEST_ASSERT_EQUAL(stream.tell(), 2);
  25. MORDOR_TEST_ASSERT(buffer == "co");
  26. MORDOR_TEST_ASSERT(stream.buffer() == "cody");
  27. MORDOR_TEST_ASSERT(stream.readBuffer() == "dy");
  28. }
  29. MORDOR_UNITTEST(MemoryStream, absoluteSeek)
  30. {
  31. MemoryStream stream;
  32. stream.write("cody", 4u);
  33. MORDOR_TEST_ASSERT(stream.buffer() == "cody");
  34. MORDOR_TEST_ASSERT(stream.readBuffer() == "");
  35. MORDOR_TEST_ASSERT_EXCEPTION(stream.seek(-1, Stream::BEGIN), std::invalid_argument);
  36. #ifdef X86
  37. MORDOR_TEST_ASSERT_EXCEPTION(stream.seek(0x100000000ull, Stream::BEGIN), std::invalid_argument);
  38. #endif
  39. MORDOR_TEST_ASSERT_EQUAL(stream.seek(0, Stream::BEGIN), 0);
  40. MORDOR_TEST_ASSERT(stream.buffer() == "cody");
  41. MORDOR_TEST_ASSERT(stream.readBuffer() == "cody");
  42. MORDOR_TEST_ASSERT_EQUAL(stream.seek(2, Stream::BEGIN), 2);
  43. MORDOR_TEST_ASSERT(stream.buffer() == "cody");
  44. MORDOR_TEST_ASSERT(stream.readBuffer() == "dy");
  45. MORDOR_TEST_ASSERT_EQUAL(stream.seek(4, Stream::BEGIN), 4);
  46. MORDOR_TEST_ASSERT(stream.buffer() == "cody");
  47. MORDOR_TEST_ASSERT(stream.readBuffer() == "");
  48. MORDOR_TEST_ASSERT_EQUAL(stream.seek(6, Stream::BEGIN), 6);
  49. MORDOR_TEST_ASSERT(stream.buffer() == "cody");
  50. MORDOR_TEST_ASSERT(stream.readBuffer() == "");
  51. }
  52. MORDOR_UNITTEST(MemoryStream, forwardSeek)
  53. {
  54. MemoryStream stream;
  55. stream.write("cody", 4u);
  56. MORDOR_TEST_ASSERT(stream.buffer() == "cody");
  57. MORDOR_TEST_ASSERT(stream.readBuffer() == "");
  58. MORDOR_TEST_ASSERT_EQUAL(stream.seek(2, Stream::BEGIN), 2);
  59. MORDOR_TEST_ASSERT(stream.buffer() == "cody");
  60. MORDOR_TEST_ASSERT(stream.readBuffer() == "dy");
  61. MORDOR_TEST_ASSERT_EQUAL(stream.seek(1, Stream::CURRENT), 3);
  62. MORDOR_TEST_ASSERT(stream.buffer() == "cody");
  63. MORDOR_TEST_ASSERT(stream.readBuffer() == "y");
  64. MORDOR_TEST_ASSERT_EQUAL(stream.seek(1, Stream::CURRENT), 4);
  65. MORDOR_TEST_ASSERT(stream.buffer() == "cody");
  66. MORDOR_TEST_ASSERT(stream.readBuffer() == "");
  67. MORDOR_TEST_ASSERT_EQUAL(stream.seek(1, Stream::CURRENT), 5);
  68. MORDOR_TEST_ASSERT(stream.buffer() == "cody");
  69. MORDOR_TEST_ASSERT(stream.readBuffer() == "");
  70. #ifdef X86
  71. MORDOR_TEST_ASSERT_EXCEPTION(stream.seek(0x100000000ull, Stream::CURRENT), std::invalid_argument);
  72. #endif
  73. }
  74. MORDOR_UNITTEST(MemoryStream, backwardSeek)
  75. {
  76. MemoryStream stream;
  77. stream.write("cody", 4u);
  78. MORDOR_TEST_ASSERT(stream.buffer() == "cody");
  79. MORDOR_TEST_ASSERT(stream.readBuffer() == "");
  80. MORDOR_TEST_ASSERT_EQUAL(stream.seek(2, Stream::BEGIN), 2);
  81. MORDOR_TEST_ASSERT(stream.buffer() == "cody");
  82. MORDOR_TEST_ASSERT(stream.readBuffer() == "dy");
  83. MORDOR_TEST_ASSERT_EQUAL(stream.seek(-1, Stream::CURRENT), 1);
  84. MORDOR_TEST_ASSERT(stream.buffer() == "cody");
  85. MORDOR_TEST_ASSERT(stream.readBuffer() == "ody");
  86. MORDOR_TEST_ASSERT_EXCEPTION(stream.seek(-2, Stream::CURRENT), std::invalid_argument);
  87. }
  88. MORDOR_UNITTEST(MemoryStream, seekFromEnd)
  89. {
  90. MemoryStream stream;
  91. stream.write("cody", 4u);
  92. MORDOR_TEST_ASSERT(stream.buffer() == "cody");
  93. MORDOR_TEST_ASSERT(stream.readBuffer() == "");
  94. MORDOR_TEST_ASSERT_EQUAL(stream.seek(0, Stream::END), 4);
  95. MORDOR_TEST_ASSERT(stream.buffer() == "cody");
  96. MORDOR_TEST_ASSERT(stream.readBuffer() == "");
  97. MORDOR_TEST_ASSERT_EQUAL(stream.seek(1, Stream::END), 5);
  98. MORDOR_TEST_ASSERT(stream.buffer() == "cody");
  99. MORDOR_TEST_ASSERT(stream.readBuffer() == "");
  100. MORDOR_TEST_ASSERT_EQUAL(stream.seek(-2, Stream::END), 2);
  101. MORDOR_TEST_ASSERT(stream.buffer() == "cody");
  102. MORDOR_TEST_ASSERT(stream.readBuffer() == "dy");
  103. // Should catch an optimized forward seek
  104. MORDOR_TEST_ASSERT_EQUAL(stream.seek(-1, Stream::END), 3);
  105. MORDOR_TEST_ASSERT(stream.buffer() == "cody");
  106. MORDOR_TEST_ASSERT(stream.readBuffer() == "y");
  107. MORDOR_TEST_ASSERT_EXCEPTION(stream.seek(-5, Stream::CURRENT), std::invalid_argument);
  108. }
  109. MORDOR_UNITTEST(MemoryStream, truncate)
  110. {
  111. MemoryStream stream;
  112. stream.write("cody", 4u);
  113. MORDOR_TEST_ASSERT(stream.buffer() == "cody");
  114. MORDOR_TEST_ASSERT(stream.readBuffer() == "");
  115. MORDOR_TEST_ASSERT_EQUAL(stream.tell(), 4);
  116. stream.truncate(4);
  117. MORDOR_TEST_ASSERT(stream.buffer() == "cody");
  118. MORDOR_TEST_ASSERT(stream.readBuffer() == "");
  119. MORDOR_TEST_ASSERT_EQUAL(stream.tell(), 4);
  120. stream.truncate(3);
  121. MORDOR_TEST_ASSERT(stream.buffer() == "cod");
  122. MORDOR_TEST_ASSERT(stream.readBuffer() == "");
  123. MORDOR_TEST_ASSERT_EQUAL(stream.tell(), 4);
  124. stream.truncate(5);
  125. MORDOR_TEST_ASSERT(stream.buffer() == std::string("cod\0\0", 5));
  126. MORDOR_TEST_ASSERT(stream.readBuffer() == std::string("\0", 1));
  127. MORDOR_TEST_ASSERT_EQUAL(stream.tell(), 4);
  128. stream.truncate(0);
  129. MORDOR_TEST_ASSERT(stream.buffer() == "");
  130. MORDOR_TEST_ASSERT(stream.readBuffer() == "");
  131. MORDOR_TEST_ASSERT_EQUAL(stream.tell(), 4);
  132. #ifdef X86
  133. MORDOR_TEST_ASSERT_EXCEPTION(stream.truncate(0x100000000ull), std::invalid_argument);
  134. #endif
  135. }
  136. MORDOR_UNITTEST(MemoryStream, writeExtension)
  137. {
  138. MemoryStream stream;
  139. stream.write("cody", 4u);
  140. MORDOR_TEST_ASSERT(stream.buffer() == "cody");
  141. MORDOR_TEST_ASSERT_EQUAL(stream.seek(1, Stream::END), 5);
  142. MORDOR_TEST_ASSERT(stream.buffer() == "cody");
  143. MORDOR_TEST_ASSERT_EQUAL(stream.write("cutrer", 6), 6u);
  144. MORDOR_TEST_ASSERT_EQUAL(stream.size(), 11);
  145. MORDOR_TEST_ASSERT(stream.buffer() == std::string("cody\0cutrer", 11));
  146. }
  147. MORDOR_UNITTEST(MemoryStream, writep1)
  148. {
  149. MemoryStream stream;
  150. stream.write("cody", 4u);
  151. MORDOR_TEST_ASSERT(stream.buffer() == "cody");
  152. MORDOR_TEST_ASSERT_EQUAL(stream.seek(1, Stream::BEGIN), 1);
  153. MORDOR_TEST_ASSERT_EQUAL(stream.write("c", 1), 1u);
  154. MORDOR_TEST_ASSERT_EQUAL(stream.tell(), 2);
  155. MORDOR_TEST_ASSERT(stream.buffer() == "ccdy");
  156. }
  157. MORDOR_UNITTEST(MemoryStream, writep2)
  158. {
  159. MemoryStream stream;
  160. stream.write("cody", 4u);
  161. MORDOR_TEST_ASSERT(stream.buffer() == "cody");
  162. MORDOR_TEST_ASSERT_EQUAL(stream.seek(1, Stream::BEGIN), 1);
  163. MORDOR_TEST_ASSERT_EQUAL(stream.write("cutrer", 6), 6u);
  164. MORDOR_TEST_ASSERT_EQUAL(stream.tell(), 7);
  165. MORDOR_TEST_ASSERT_EQUAL(stream.size(), 7);
  166. MORDOR_TEST_ASSERT(stream.buffer() == "ccutrer");
  167. }