| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2013 Google Inc. All rights reserved. | 2 * Copyright (C) 2013 Google Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
| 6 * met: | 6 * met: |
| 7 * | 7 * |
| 8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
| (...skipping 19 matching lines...) Expand all Loading... |
| 30 | 30 |
| 31 #include "wtf/ArrayBufferBuilder.h" | 31 #include "wtf/ArrayBufferBuilder.h" |
| 32 | 32 |
| 33 #include "testing/gtest/include/gtest/gtest.h" | 33 #include "testing/gtest/include/gtest/gtest.h" |
| 34 #include "wtf/Assertions.h" | 34 #include "wtf/Assertions.h" |
| 35 #include <limits.h> | 35 #include <limits.h> |
| 36 #include <string.h> | 36 #include <string.h> |
| 37 | 37 |
| 38 namespace WTF { | 38 namespace WTF { |
| 39 | 39 |
| 40 TEST(ArrayBufferBuilderTest, Constructor) | 40 TEST(ArrayBufferBuilderTest, Constructor) { |
| 41 { | 41 ArrayBufferBuilder zeroBuilder(0); |
| 42 ArrayBufferBuilder zeroBuilder(0); | 42 EXPECT_EQ(0u, zeroBuilder.byteLength()); |
| 43 EXPECT_EQ(0u, zeroBuilder.byteLength()); | 43 EXPECT_EQ(0u, zeroBuilder.capacity()); |
| 44 EXPECT_EQ(0u, zeroBuilder.capacity()); | |
| 45 | 44 |
| 46 ArrayBufferBuilder smallBuilder(1024); | 45 ArrayBufferBuilder smallBuilder(1024); |
| 47 EXPECT_EQ(0u, zeroBuilder.byteLength()); | 46 EXPECT_EQ(0u, zeroBuilder.byteLength()); |
| 48 EXPECT_EQ(1024u, smallBuilder.capacity()); | 47 EXPECT_EQ(1024u, smallBuilder.capacity()); |
| 49 | 48 |
| 50 ArrayBufferBuilder bigBuilder(2048); | 49 ArrayBufferBuilder bigBuilder(2048); |
| 51 EXPECT_EQ(0u, zeroBuilder.byteLength()); | 50 EXPECT_EQ(0u, zeroBuilder.byteLength()); |
| 52 EXPECT_EQ(2048u, bigBuilder.capacity()); | 51 EXPECT_EQ(2048u, bigBuilder.capacity()); |
| 53 } | 52 } |
| 54 | 53 |
| 55 TEST(ArrayBufferBuilderTest, Append) | 54 TEST(ArrayBufferBuilderTest, Append) { |
| 56 { | 55 const char data[] = "HelloWorld"; |
| 57 const char data[] = "HelloWorld"; | 56 size_t dataSize = sizeof(data) - 1; |
| 58 size_t dataSize = sizeof(data) - 1; | |
| 59 | 57 |
| 60 ArrayBufferBuilder builder(2 * dataSize); | 58 ArrayBufferBuilder builder(2 * dataSize); |
| 61 | 59 |
| 62 EXPECT_EQ(dataSize, builder.append(data, dataSize)); | 60 EXPECT_EQ(dataSize, builder.append(data, dataSize)); |
| 63 EXPECT_EQ(dataSize, builder.byteLength()); | 61 EXPECT_EQ(dataSize, builder.byteLength()); |
| 64 EXPECT_EQ(dataSize * 2, builder.capacity()); | 62 EXPECT_EQ(dataSize * 2, builder.capacity()); |
| 65 | 63 |
| 66 EXPECT_EQ(dataSize, builder.append(data, dataSize)); | 64 EXPECT_EQ(dataSize, builder.append(data, dataSize)); |
| 67 EXPECT_EQ(dataSize * 2, builder.byteLength()); | 65 EXPECT_EQ(dataSize * 2, builder.byteLength()); |
| 68 EXPECT_EQ(dataSize * 2, builder.capacity()); | 66 EXPECT_EQ(dataSize * 2, builder.capacity()); |
| 69 | 67 |
| 70 EXPECT_EQ(dataSize, builder.append(data, dataSize)); | 68 EXPECT_EQ(dataSize, builder.append(data, dataSize)); |
| 71 EXPECT_EQ(dataSize * 3, builder.byteLength()); | 69 EXPECT_EQ(dataSize * 3, builder.byteLength()); |
| 72 EXPECT_GE(builder.capacity(), dataSize * 3); | 70 EXPECT_GE(builder.capacity(), dataSize * 3); |
| 73 } | 71 } |
| 74 | 72 |
| 75 TEST(ArrayBufferBuilderTest, AppendRepeatedly) | 73 TEST(ArrayBufferBuilderTest, AppendRepeatedly) { |
| 76 { | 74 const char data[] = "HelloWorld"; |
| 77 const char data[] = "HelloWorld"; | 75 size_t dataSize = sizeof(data) - 1; |
| 78 size_t dataSize = sizeof(data) - 1; | |
| 79 | 76 |
| 80 ArrayBufferBuilder builder(37); // Some number coprime with dataSize. | 77 ArrayBufferBuilder builder(37); // Some number coprime with dataSize. |
| 81 | 78 |
| 82 for (size_t i = 1; i < 1000U; ++i) { | 79 for (size_t i = 1; i < 1000U; ++i) { |
| 83 EXPECT_EQ(dataSize, builder.append(data, dataSize)); | 80 EXPECT_EQ(dataSize, builder.append(data, dataSize)); |
| 84 EXPECT_EQ(dataSize * i, builder.byteLength()); | 81 EXPECT_EQ(dataSize * i, builder.byteLength()); |
| 85 EXPECT_GE(builder.capacity(), dataSize * i); | 82 EXPECT_GE(builder.capacity(), dataSize * i); |
| 86 } | 83 } |
| 87 } | 84 } |
| 88 | 85 |
| 89 TEST(ArrayBufferBuilderTest, DefaultConstructorAndAppendRepeatedly) | 86 TEST(ArrayBufferBuilderTest, DefaultConstructorAndAppendRepeatedly) { |
| 90 { | 87 const char data[] = "HelloWorld"; |
| 91 const char data[] = "HelloWorld"; | 88 size_t dataSize = sizeof(data) - 1; |
| 92 size_t dataSize = sizeof(data) - 1; | |
| 93 | 89 |
| 94 ArrayBufferBuilder builder; | 90 ArrayBufferBuilder builder; |
| 95 | 91 |
| 96 for (size_t i = 1; i < 4000U; ++i) { | 92 for (size_t i = 1; i < 4000U; ++i) { |
| 97 EXPECT_EQ(dataSize, builder.append(data, dataSize)); | 93 EXPECT_EQ(dataSize, builder.append(data, dataSize)); |
| 98 EXPECT_EQ(dataSize * i, builder.byteLength()); | 94 EXPECT_EQ(dataSize * i, builder.byteLength()); |
| 99 EXPECT_GE(builder.capacity(), dataSize * i); | 95 EXPECT_GE(builder.capacity(), dataSize * i); |
| 100 } | 96 } |
| 101 } | 97 } |
| 102 | 98 |
| 103 TEST(ArrayBufferBuilderTest, AppendFixedCapacity) | 99 TEST(ArrayBufferBuilderTest, AppendFixedCapacity) { |
| 104 { | 100 const char data[] = "HelloWorld"; |
| 105 const char data[] = "HelloWorld"; | 101 size_t dataSize = sizeof(data) - 1; |
| 106 size_t dataSize = sizeof(data) - 1; | |
| 107 | 102 |
| 108 ArrayBufferBuilder builder(15); | 103 ArrayBufferBuilder builder(15); |
| 109 builder.setVariableCapacity(false); | 104 builder.setVariableCapacity(false); |
| 110 | 105 |
| 111 EXPECT_EQ(dataSize, builder.append(data, dataSize)); | 106 EXPECT_EQ(dataSize, builder.append(data, dataSize)); |
| 112 EXPECT_EQ(dataSize, builder.byteLength()); | 107 EXPECT_EQ(dataSize, builder.byteLength()); |
| 113 EXPECT_EQ(15u, builder.capacity()); | 108 EXPECT_EQ(15u, builder.capacity()); |
| 114 | 109 |
| 115 EXPECT_EQ(5u, builder.append(data, dataSize)); | 110 EXPECT_EQ(5u, builder.append(data, dataSize)); |
| 116 EXPECT_EQ(15u, builder.byteLength()); | 111 EXPECT_EQ(15u, builder.byteLength()); |
| 117 EXPECT_EQ(15u, builder.capacity()); | 112 EXPECT_EQ(15u, builder.capacity()); |
| 118 | 113 |
| 119 EXPECT_EQ(0u, builder.append(data, dataSize)); | 114 EXPECT_EQ(0u, builder.append(data, dataSize)); |
| 120 EXPECT_EQ(15u, builder.byteLength()); | 115 EXPECT_EQ(15u, builder.byteLength()); |
| 121 EXPECT_EQ(15u, builder.capacity()); | 116 EXPECT_EQ(15u, builder.capacity()); |
| 122 } | 117 } |
| 123 | 118 |
| 124 TEST(ArrayBufferBuilderTest, ToArrayBuffer) | 119 TEST(ArrayBufferBuilderTest, ToArrayBuffer) { |
| 125 { | 120 const char data1[] = "HelloWorld"; |
| 126 const char data1[] = "HelloWorld"; | 121 size_t data1Size = sizeof(data1) - 1; |
| 127 size_t data1Size = sizeof(data1) - 1; | |
| 128 | 122 |
| 129 const char data2[] = "GoodbyeWorld"; | 123 const char data2[] = "GoodbyeWorld"; |
| 130 size_t data2Size = sizeof(data2) - 1; | 124 size_t data2Size = sizeof(data2) - 1; |
| 131 | 125 |
| 132 ArrayBufferBuilder builder(1024); | 126 ArrayBufferBuilder builder(1024); |
| 133 builder.append(data1, data1Size); | 127 builder.append(data1, data1Size); |
| 134 builder.append(data2, data2Size); | 128 builder.append(data2, data2Size); |
| 135 | 129 |
| 136 const char expected[] = "HelloWorldGoodbyeWorld"; | 130 const char expected[] = "HelloWorldGoodbyeWorld"; |
| 137 size_t expectedSize = sizeof(expected) - 1; | 131 size_t expectedSize = sizeof(expected) - 1; |
| 138 | 132 |
| 139 RefPtr<ArrayBuffer> result = builder.toArrayBuffer(); | 133 RefPtr<ArrayBuffer> result = builder.toArrayBuffer(); |
| 140 ASSERT_EQ(data1Size + data2Size, result->byteLength()); | 134 ASSERT_EQ(data1Size + data2Size, result->byteLength()); |
| 141 ASSERT_EQ(expectedSize, result->byteLength()); | 135 ASSERT_EQ(expectedSize, result->byteLength()); |
| 142 EXPECT_EQ(0, memcmp(expected, result->data(), expectedSize)); | 136 EXPECT_EQ(0, memcmp(expected, result->data(), expectedSize)); |
| 143 } | 137 } |
| 144 | 138 |
| 145 TEST(ArrayBufferBuilderTest, ToArrayBufferSameAddressIfExactCapacity) | 139 TEST(ArrayBufferBuilderTest, ToArrayBufferSameAddressIfExactCapacity) { |
| 146 { | 140 const char data[] = "HelloWorld"; |
| 147 const char data[] = "HelloWorld"; | 141 size_t dataSize = sizeof(data) - 1; |
| 148 size_t dataSize = sizeof(data) - 1; | |
| 149 | 142 |
| 150 ArrayBufferBuilder builder(dataSize); | 143 ArrayBufferBuilder builder(dataSize); |
| 151 builder.append(data, dataSize); | 144 builder.append(data, dataSize); |
| 152 | 145 |
| 153 RefPtr<ArrayBuffer> result1 = builder.toArrayBuffer(); | 146 RefPtr<ArrayBuffer> result1 = builder.toArrayBuffer(); |
| 154 RefPtr<ArrayBuffer> result2 = builder.toArrayBuffer(); | 147 RefPtr<ArrayBuffer> result2 = builder.toArrayBuffer(); |
| 155 EXPECT_EQ(result1.get(), result2.get()); | 148 EXPECT_EQ(result1.get(), result2.get()); |
| 156 } | 149 } |
| 157 | 150 |
| 158 TEST(ArrayBufferBuilderTest, ToString) | 151 TEST(ArrayBufferBuilderTest, ToString) { |
| 159 { | 152 const char data1[] = "HelloWorld"; |
| 160 const char data1[] = "HelloWorld"; | 153 size_t data1Size = sizeof(data1) - 1; |
| 161 size_t data1Size = sizeof(data1) - 1; | |
| 162 | 154 |
| 163 const char data2[] = "GoodbyeWorld"; | 155 const char data2[] = "GoodbyeWorld"; |
| 164 size_t data2Size = sizeof(data2) - 1; | 156 size_t data2Size = sizeof(data2) - 1; |
| 165 | 157 |
| 166 ArrayBufferBuilder builder(1024); | 158 ArrayBufferBuilder builder(1024); |
| 167 builder.append(data1, data1Size); | 159 builder.append(data1, data1Size); |
| 168 builder.append(data2, data2Size); | 160 builder.append(data2, data2Size); |
| 169 | 161 |
| 170 const char expected[] = "HelloWorldGoodbyeWorld"; | 162 const char expected[] = "HelloWorldGoodbyeWorld"; |
| 171 size_t expectedSize = sizeof(expected) - 1; | 163 size_t expectedSize = sizeof(expected) - 1; |
| 172 | 164 |
| 173 String result = builder.toString(); | 165 String result = builder.toString(); |
| 174 EXPECT_EQ(expectedSize, result.length()); | 166 EXPECT_EQ(expectedSize, result.length()); |
| 175 for (unsigned i = 0; i < result.length(); ++i) | 167 for (unsigned i = 0; i < result.length(); ++i) |
| 176 EXPECT_EQ(expected[i], result[i]); | 168 EXPECT_EQ(expected[i], result[i]); |
| 177 } | 169 } |
| 178 | 170 |
| 179 TEST(ArrayBufferBuilderTest, ShrinkToFitNoAppend) | 171 TEST(ArrayBufferBuilderTest, ShrinkToFitNoAppend) { |
| 180 { | 172 ArrayBufferBuilder builder(1024); |
| 181 ArrayBufferBuilder builder(1024); | 173 EXPECT_EQ(1024u, builder.capacity()); |
| 182 EXPECT_EQ(1024u, builder.capacity()); | 174 builder.shrinkToFit(); |
| 183 builder.shrinkToFit(); | 175 EXPECT_EQ(0u, builder.byteLength()); |
| 184 EXPECT_EQ(0u, builder.byteLength()); | 176 EXPECT_EQ(0u, builder.capacity()); |
| 185 EXPECT_EQ(0u, builder.capacity()); | |
| 186 } | 177 } |
| 187 | 178 |
| 188 TEST(ArrayBufferBuilderTest, ShrinkToFit) | 179 TEST(ArrayBufferBuilderTest, ShrinkToFit) { |
| 189 { | 180 const char data[] = "HelloWorld"; |
| 190 const char data[] = "HelloWorld"; | 181 size_t dataSize = sizeof(data) - 1; |
| 191 size_t dataSize = sizeof(data) - 1; | |
| 192 | 182 |
| 193 ArrayBufferBuilder builder(32); | 183 ArrayBufferBuilder builder(32); |
| 194 | 184 |
| 195 EXPECT_EQ(dataSize, builder.append(data, dataSize)); | 185 EXPECT_EQ(dataSize, builder.append(data, dataSize)); |
| 196 EXPECT_EQ(dataSize, builder.byteLength()); | 186 EXPECT_EQ(dataSize, builder.byteLength()); |
| 197 EXPECT_EQ(32u, builder.capacity()); | 187 EXPECT_EQ(32u, builder.capacity()); |
| 198 | 188 |
| 199 builder.shrinkToFit(); | 189 builder.shrinkToFit(); |
| 200 EXPECT_EQ(dataSize, builder.byteLength()); | 190 EXPECT_EQ(dataSize, builder.byteLength()); |
| 201 EXPECT_EQ(dataSize, builder.capacity()); | 191 EXPECT_EQ(dataSize, builder.capacity()); |
| 202 } | 192 } |
| 203 | 193 |
| 204 TEST(ArrayBufferBuilderTest, ShrinkToFitFullyUsed) | 194 TEST(ArrayBufferBuilderTest, ShrinkToFitFullyUsed) { |
| 205 { | 195 const char data[] = "HelloWorld"; |
| 206 const char data[] = "HelloWorld"; | 196 size_t dataSize = sizeof(data) - 1; |
| 207 size_t dataSize = sizeof(data) - 1; | |
| 208 | 197 |
| 209 ArrayBufferBuilder builder(dataSize); | 198 ArrayBufferBuilder builder(dataSize); |
| 210 const void* internalAddress = builder.data(); | 199 const void* internalAddress = builder.data(); |
| 211 | 200 |
| 212 EXPECT_EQ(dataSize, builder.append(data, dataSize)); | 201 EXPECT_EQ(dataSize, builder.append(data, dataSize)); |
| 213 EXPECT_EQ(dataSize, builder.byteLength()); | 202 EXPECT_EQ(dataSize, builder.byteLength()); |
| 214 EXPECT_EQ(dataSize, builder.capacity()); | 203 EXPECT_EQ(dataSize, builder.capacity()); |
| 215 | 204 |
| 216 builder.shrinkToFit(); | 205 builder.shrinkToFit(); |
| 217 // Reallocation should not happen. | 206 // Reallocation should not happen. |
| 218 EXPECT_EQ(internalAddress, builder.data()); | 207 EXPECT_EQ(internalAddress, builder.data()); |
| 219 EXPECT_EQ(dataSize, builder.byteLength()); | 208 EXPECT_EQ(dataSize, builder.byteLength()); |
| 220 EXPECT_EQ(dataSize, builder.capacity()); | 209 EXPECT_EQ(dataSize, builder.capacity()); |
| 221 } | 210 } |
| 222 | 211 |
| 223 TEST(ArrayBufferBuilderTest, ShrinkToFitAfterGrowth) | 212 TEST(ArrayBufferBuilderTest, ShrinkToFitAfterGrowth) { |
| 224 { | 213 const char data[] = "HelloWorld"; |
| 225 const char data[] = "HelloWorld"; | 214 size_t dataSize = sizeof(data) - 1; |
| 226 size_t dataSize = sizeof(data) - 1; | |
| 227 | 215 |
| 228 ArrayBufferBuilder builder(5); | 216 ArrayBufferBuilder builder(5); |
| 229 | 217 |
| 230 EXPECT_EQ(dataSize, builder.append(data, dataSize)); | 218 EXPECT_EQ(dataSize, builder.append(data, dataSize)); |
| 231 EXPECT_GE(builder.capacity(), dataSize); | 219 EXPECT_GE(builder.capacity(), dataSize); |
| 232 builder.shrinkToFit(); | 220 builder.shrinkToFit(); |
| 233 EXPECT_EQ(dataSize, builder.byteLength()); | 221 EXPECT_EQ(dataSize, builder.byteLength()); |
| 234 EXPECT_EQ(dataSize, builder.capacity()); | 222 EXPECT_EQ(dataSize, builder.capacity()); |
| 235 } | 223 } |
| 236 | 224 |
| 237 } // namespace WTF | 225 } // namespace WTF |
| OLD | NEW |