1f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org// Copyright 2014 the V8 project authors. All rights reserved. 2f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org// Redistribution and use in source and binary forms, with or without 3f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org// modification, are permitted provided that the following conditions are 4f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org// met: 5f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org// 6f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org// * Redistributions of source code must retain the above copyright 7f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org// notice, this list of conditions and the following disclaimer. 8f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org// * Redistributions in binary form must reproduce the above 9f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org// copyright notice, this list of conditions and the following 10f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org// disclaimer in the documentation and/or other materials provided 11f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org// with the distribution. 12f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org// * Neither the name of Google Inc. nor the names of its 13f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org// contributors may be used to endorse or promote products derived 14f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org// from this software without specific prior written permission. 15f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org// 16f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org 28f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org#include <stdlib.h> 29f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org#include <utility> 30f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org 31f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org#include "src/v8.h" 32f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org 33f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org#include "test/cctest/cctest.h" 34f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org 35f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.orgusing namespace v8::internal; 36f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org 37f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.orgTEST(RingBufferPartialFill) { 38f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org const int max_size = 6; 39f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org typedef RingBuffer<int, max_size>::const_iterator Iter; 40f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org RingBuffer<int, max_size> ring_buffer; 41f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org CHECK(ring_buffer.empty()); 42f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org CHECK_EQ(static_cast<int>(ring_buffer.size()), 0); 43f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org CHECK(ring_buffer.begin() == ring_buffer.end()); 44f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org 45f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org // Fill ring_buffer partially: [0, 1, 2] 46f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org for (int i = 0; i < max_size / 2; i++) ring_buffer.push_back(i); 47f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org 48f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org CHECK(!ring_buffer.empty()); 49f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org CHECK(static_cast<int>(ring_buffer.size()) == max_size / 2); 50f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org CHECK(ring_buffer.begin() != ring_buffer.end()); 51f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org 52f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org // Test forward itartion 53f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org int i = 0; 54f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org for (Iter iter = ring_buffer.begin(); iter != ring_buffer.end(); ++iter) { 55f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org CHECK(*iter == i); 56f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org ++i; 57f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org } 58f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org CHECK_EQ(i, 3); // one past last element. 59f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org 60f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org // Test backward iteration 61f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org i = 2; 62f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org Iter iter = ring_buffer.back(); 63f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org while (true) { 64f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org CHECK(*iter == i); 65f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org if (iter == ring_buffer.begin()) break; 66f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org --iter; 67f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org --i; 68f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org } 69f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org CHECK_EQ(i, 0); 70f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org} 71f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org 72f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org 73f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.orgTEST(RingBufferWrapAround) { 74f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org const int max_size = 6; 75f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org typedef RingBuffer<int, max_size>::const_iterator Iter; 76f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org RingBuffer<int, max_size> ring_buffer; 77f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org 78f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org // Fill ring_buffer (wrap around): [9, 10, 11, 12, 13, 14] 79f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org for (int i = 0; i < 2 * max_size + 3; i++) ring_buffer.push_back(i); 80f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org 81f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org CHECK(!ring_buffer.empty()); 82f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org CHECK(static_cast<int>(ring_buffer.size()) == max_size); 83f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org CHECK(ring_buffer.begin() != ring_buffer.end()); 84f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org 85f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org // Test forward iteration 86f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org int i = 9; 87f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org for (Iter iter = ring_buffer.begin(); iter != ring_buffer.end(); ++iter) { 88f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org CHECK(*iter == i); 89f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org ++i; 90f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org } 91f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org CHECK_EQ(i, 15); // one past last element. 92f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org 93f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org // Test backward iteration 94f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org i = 14; 95f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org Iter iter = ring_buffer.back(); 96f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org while (true) { 97f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org CHECK(*iter == i); 98f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org if (iter == ring_buffer.begin()) break; 99f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org --iter; 100f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org --i; 101f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org } 102f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org CHECK_EQ(i, 9); 103f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org} 104f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org 105f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org 106f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.orgTEST(RingBufferPushFront) { 107f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org const int max_size = 6; 108f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org typedef RingBuffer<int, max_size>::const_iterator Iter; 109f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org RingBuffer<int, max_size> ring_buffer; 110f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org 111f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org // Fill ring_buffer (wrap around): [14, 13, 12, 11, 10, 9] 112f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org for (int i = 0; i < 2 * max_size + 3; i++) ring_buffer.push_front(i); 113f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org 114f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org CHECK(!ring_buffer.empty()); 115f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org CHECK(static_cast<int>(ring_buffer.size()) == max_size); 116f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org CHECK(ring_buffer.begin() != ring_buffer.end()); 117f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org 118f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org // Test forward iteration 119f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org int i = 14; 120f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org for (Iter iter = ring_buffer.begin(); iter != ring_buffer.end(); ++iter) { 121f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org CHECK(*iter == i); 122f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org --i; 123f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org } 124f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org CHECK_EQ(i, 8); // one past last element. 125f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org} 126