1bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)/*
2bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) * Copyright (C) 2013 Google Inc. All rights reserved.
3bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) *
4bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without
5bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) * modification, are permitted provided that the following conditions are
6bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) * met:
7bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) *
8bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) *     * Redistributions of source code must retain the above copyright
9bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) * notice, this list of conditions and the following disclaimer.
10bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) *     * Redistributions in binary form must reproduce the above
11bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) * copyright notice, this list of conditions and the following disclaimer
12bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) * in the documentation and/or other materials provided with the
13bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) * distribution.
14bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) *     * Neither the name of Google Inc. nor the names of its
15bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) * contributors may be used to endorse or promote products derived from
16bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) * this software without specific prior written permission.
17bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) *
18bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) */
30bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
31bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)#include "config.h"
32bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)#include "wtf/ArrayBufferBuilder.h"
33bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
34bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)#include "wtf/Assertions.h"
35bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)#include <gtest/gtest.h>
3609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include <limits.h>
37bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)#include <string.h>
38bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
39bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)namespace WTF {
40bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
41f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo LiuTEST(ArrayBufferBuilderTest, Constructor)
42bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles){
43bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    ArrayBufferBuilder zeroBuilder(0);
44f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    EXPECT_EQ(0u, zeroBuilder.byteLength());
45f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    EXPECT_EQ(0u, zeroBuilder.capacity());
46bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
47bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    ArrayBufferBuilder smallBuilder(1024);
48f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    EXPECT_EQ(0u, zeroBuilder.byteLength());
49f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    EXPECT_EQ(1024u, smallBuilder.capacity());
50bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
51bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    ArrayBufferBuilder bigBuilder(2048);
52f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    EXPECT_EQ(0u, zeroBuilder.byteLength());
53f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    EXPECT_EQ(2048u, bigBuilder.capacity());
54bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)}
55bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
56f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo LiuTEST(ArrayBufferBuilderTest, Append)
57bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles){
58bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    const char data[] = "HelloWorld";
59bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    size_t dataSize = sizeof(data) - 1;
60bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
61bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    ArrayBufferBuilder builder(2 * dataSize);
62bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
63bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    EXPECT_EQ(dataSize, builder.append(data, dataSize));
64bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    EXPECT_EQ(dataSize, builder.byteLength());
65bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    EXPECT_EQ(dataSize * 2, builder.capacity());
66bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
67bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    EXPECT_EQ(dataSize, builder.append(data, dataSize));
68bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    EXPECT_EQ(dataSize * 2, builder.byteLength());
69bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    EXPECT_EQ(dataSize * 2, builder.capacity());
70bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
71bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    EXPECT_EQ(dataSize, builder.append(data, dataSize));
72bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    EXPECT_EQ(dataSize * 3, builder.byteLength());
73bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    EXPECT_GE(builder.capacity(), dataSize * 3);
74bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)}
75bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
76f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo LiuTEST(ArrayBufferBuilderTest, AppendRepeatedly)
77bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles){
78bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    const char data[] = "HelloWorld";
79bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    size_t dataSize = sizeof(data) - 1;
80bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
81bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    ArrayBufferBuilder builder(37); // Some number coprime with dataSize.
82bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
83bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    for (size_t i = 1; i < 1000U; ++i) {
84bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        EXPECT_EQ(dataSize, builder.append(data, dataSize));
85bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        EXPECT_EQ(dataSize * i, builder.byteLength());
86bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        EXPECT_GE(builder.capacity(), dataSize * i);
87bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    }
88bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)}
89bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
90f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo LiuTEST(ArrayBufferBuilderTest, DefaultConstructorAndAppendRepeatedly)
91bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles){
92bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    const char data[] = "HelloWorld";
93bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    size_t dataSize = sizeof(data) - 1;
94bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
95bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    ArrayBufferBuilder builder;
96bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
97bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    for (size_t i = 1; i < 4000U; ++i) {
98bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        EXPECT_EQ(dataSize, builder.append(data, dataSize));
99bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        EXPECT_EQ(dataSize * i, builder.byteLength());
100bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        EXPECT_GE(builder.capacity(), dataSize * i);
101bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    }
102bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)}
103bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
104f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo LiuTEST(ArrayBufferBuilderTest, AppendFixedCapacity)
105bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles){
106bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    const char data[] = "HelloWorld";
107bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    size_t dataSize = sizeof(data) - 1;
108bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
109bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    ArrayBufferBuilder builder(15);
110bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    builder.setVariableCapacity(false);
111bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
112bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    EXPECT_EQ(dataSize, builder.append(data, dataSize));
113bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    EXPECT_EQ(dataSize, builder.byteLength());
114f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    EXPECT_EQ(15u, builder.capacity());
115bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
116f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    EXPECT_EQ(5u, builder.append(data, dataSize));
117f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    EXPECT_EQ(15u, builder.byteLength());
118f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    EXPECT_EQ(15u, builder.capacity());
119bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
120f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    EXPECT_EQ(0u, builder.append(data, dataSize));
121f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    EXPECT_EQ(15u, builder.byteLength());
122f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    EXPECT_EQ(15u, builder.capacity());
123bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)}
124bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
125f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo LiuTEST(ArrayBufferBuilderTest, ToArrayBuffer)
126bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles){
127bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    const char data1[] = "HelloWorld";
128bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    size_t data1Size = sizeof(data1) - 1;
129bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
130bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    const char data2[] = "GoodbyeWorld";
131bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    size_t data2Size = sizeof(data2) - 1;
132bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
133bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    ArrayBufferBuilder builder(1024);
134bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    builder.append(data1, data1Size);
135bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    builder.append(data2, data2Size);
136bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
137bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    const char expected[] = "HelloWorldGoodbyeWorld";
138f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    size_t expectedSize = sizeof(expected) - 1;
139bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
140bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    RefPtr<ArrayBuffer> result = builder.toArrayBuffer();
141bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    ASSERT_EQ(data1Size + data2Size, result->byteLength());
142f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    ASSERT_EQ(expectedSize, result->byteLength());
143bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    EXPECT_EQ(0, memcmp(expected, result->data(), expectedSize));
144bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)}
145bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
146f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo LiuTEST(ArrayBufferBuilderTest, ToArrayBufferSameAddressIfExactCapacity)
147bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles){
148bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    const char data[] = "HelloWorld";
149bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    size_t dataSize = sizeof(data) - 1;
150bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
151bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    ArrayBufferBuilder builder(dataSize);
152bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    builder.append(data, dataSize);
153bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
154bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    RefPtr<ArrayBuffer> result1 = builder.toArrayBuffer();
155bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    RefPtr<ArrayBuffer> result2 = builder.toArrayBuffer();
156bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    EXPECT_EQ(result1.get(), result2.get());
157bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)}
158bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
159f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo LiuTEST(ArrayBufferBuilderTest, ToString)
160bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles){
161bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    const char data1[] = "HelloWorld";
162bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    size_t data1Size = sizeof(data1) - 1;
163bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
164bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    const char data2[] = "GoodbyeWorld";
165bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    size_t data2Size = sizeof(data2) - 1;
166bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
167bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    ArrayBufferBuilder builder(1024);
168bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    builder.append(data1, data1Size);
169bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    builder.append(data2, data2Size);
170bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
171bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    const char expected[] = "HelloWorldGoodbyeWorld";
172bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    size_t expectedSize = sizeof(expected) - 1;
173bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
174bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    String result = builder.toString();
175bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    EXPECT_EQ(expectedSize, result.length());
176bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    for (unsigned i = 0; i < result.length(); ++i)
177bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        EXPECT_EQ(expected[i], result[i]);
178bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)}
179bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
180f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo LiuTEST(ArrayBufferBuilderTest, ShrinkToFitNoAppend)
181bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles){
182bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    ArrayBufferBuilder builder(1024);
183f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    EXPECT_EQ(1024u, builder.capacity());
184bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    builder.shrinkToFit();
185f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    EXPECT_EQ(0u, builder.byteLength());
186f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    EXPECT_EQ(0u, builder.capacity());
187bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)}
188bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
189f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo LiuTEST(ArrayBufferBuilderTest, ShrinkToFit)
190bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles){
191bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    const char data[] = "HelloWorld";
192bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    size_t dataSize = sizeof(data) - 1;
193bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
194bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    ArrayBufferBuilder builder(32);
195bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
196bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    EXPECT_EQ(dataSize, builder.append(data, dataSize));
197bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    EXPECT_EQ(dataSize, builder.byteLength());
198f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    EXPECT_EQ(32u, builder.capacity());
199bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
200bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    builder.shrinkToFit();
201bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    EXPECT_EQ(dataSize, builder.byteLength());
202bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    EXPECT_EQ(dataSize, builder.capacity());
203bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)}
204bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
205f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo LiuTEST(ArrayBufferBuilderTest, ShrinkToFitFullyUsed)
206bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles){
207bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    const char data[] = "HelloWorld";
208bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    size_t dataSize = sizeof(data) - 1;
209bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
210bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    ArrayBufferBuilder builder(dataSize);
211bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    const void* internalAddress = builder.data();
212bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
213bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    EXPECT_EQ(dataSize, builder.append(data, dataSize));
214bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    EXPECT_EQ(dataSize, builder.byteLength());
215bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    EXPECT_EQ(dataSize, builder.capacity());
216bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
217bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    builder.shrinkToFit();
218bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    // Reallocation should not happen.
219bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    EXPECT_EQ(internalAddress, builder.data());
220bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    EXPECT_EQ(dataSize, builder.byteLength());
221bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    EXPECT_EQ(dataSize, builder.capacity());
222bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)}
223bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
224f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo LiuTEST(ArrayBufferBuilderTest, ShrinkToFitAfterGrowth)
225bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles){
226bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    const char data[] = "HelloWorld";
227bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    size_t dataSize = sizeof(data) - 1;
228bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
229bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    ArrayBufferBuilder builder(5);
230bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
231bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    EXPECT_EQ(dataSize, builder.append(data, dataSize));
232bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    EXPECT_GE(builder.capacity(), dataSize);
233bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    builder.shrinkToFit();
234bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    EXPECT_EQ(dataSize, builder.byteLength());
235bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    EXPECT_EQ(dataSize, builder.capacity());
236bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)}
237bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
238bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)} // namespace WTF
239