// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "array.h"

#include <gtest/gtest.h>

namespace {

struct point {
  int x, y;
};

DECLARE_ARRAY_TYPE(double, double_array);
DECLARE_ARRAY_TYPE(struct point, point_array);

TEST(ArrayTest, Basic) {
  double_array a = ARRAY_INIT;

  /* create an array {1.0, 2.0} */
  ARRAY_APPEND(&a, 1.0);
  double* p = ARRAY_APPEND_ZERO(&a);
  EXPECT_EQ(0.0, *p);
  *p = 2.0;

  EXPECT_EQ(2, ARRAY_COUNT(&a));
  EXPECT_EQ(2, a.count);
  EXPECT_GE(a.size, 2);
  EXPECT_EQ(1.0, *ARRAY_ELEMENT(&a, 0));
  EXPECT_EQ(2.0, *ARRAY_ELEMENT(&a, 1));
  EXPECT_EQ(1.0, a.element[0]);
  EXPECT_EQ(2.0, a.element[1]);
  EXPECT_EQ(0, ARRAY_FIND(&a, 1.0));
  EXPECT_EQ(1, ARRAY_FIND(&a, 2.0));
  EXPECT_EQ(-1, ARRAY_FIND(&a, 0.0));
  EXPECT_EQ(0, ARRAY_INDEX(&a, ARRAY_ELEMENT(&a, 0)));
  EXPECT_EQ(1, ARRAY_INDEX(&a, ARRAY_ELEMENT(&a, 1)));

  ARRAY_FREE(&a);
  EXPECT_EQ(0, ARRAY_COUNT(&a));
  EXPECT_EQ(0, a.count);
  EXPECT_EQ(0, a.size);
  EXPECT_EQ(NULL, a.element);
}

TEST(ArrayTest, StructElement) {
  struct point p = {1, 2};
  struct point q = {3, 4};
  point_array a = ARRAY_INIT;

  ARRAY_APPEND(&a, p);
  ARRAY_APPEND(&a, q);

  EXPECT_EQ(2, ARRAY_COUNT(&a));
  EXPECT_EQ(1, ARRAY_ELEMENT(&a, 0)->x);
  EXPECT_EQ(2, ARRAY_ELEMENT(&a, 0)->y);
  EXPECT_EQ(3, a.element[1].x);
  EXPECT_EQ(4, a.element[1].y);
  ARRAY_ELEMENT(&a, 1)->y = 5;
  EXPECT_EQ(5, a.element[1].y);

  ARRAY_FREE(&a);
  EXPECT_EQ(0, ARRAY_COUNT(&a));
  EXPECT_EQ(0, a.size);
  EXPECT_EQ(NULL, a.element);
}

TEST(ArrayTest, AppendZeroStruct) {
  point_array a = ARRAY_INIT;
  struct point *p, *q;

  p = ARRAY_APPEND_ZERO(&a);
  EXPECT_EQ(0, p->x);
  EXPECT_EQ(0, p->y);
  EXPECT_EQ(1, a.count);

  q = ARRAY_APPEND_ZERO(&a);
  EXPECT_EQ(0, q->x);
  EXPECT_EQ(0, q->y);
  EXPECT_EQ(2, a.count);

  ARRAY_FREE(&a);
}

TEST(ArrayTest, ForLoop) {
  int i;
  double* p;
  double_array a = ARRAY_INIT;

  for (i = 0; i < 100; i++) {
    ARRAY_APPEND(&a, i * 2);
  }

  int expectedIndex = 0;
  double expectedValue = 0;
  ARRAY_ELEMENT_FOREACH (&a, i, p) {
    EXPECT_EQ(expectedIndex, i);
    EXPECT_EQ(expectedValue, *p);
    expectedIndex++;
    expectedValue += 2;
  }
  EXPECT_EQ(expectedIndex, 100);

  ARRAY_FREE(&a);
  EXPECT_EQ(0, a.count);
  EXPECT_EQ(0, a.size);
  EXPECT_EQ(NULL, a.element);
}

}  //  namespace

int main(int argc, char** argv) {
  ::testing::InitGoogleTest(&argc, argv);
  return RUN_ALL_TESTS();
}
