// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

#include "bin/eventhandler.h"
#include "platform/assert.h"
#include "vm/unit_test.h"

namespace dart {
namespace bin {

VM_UNIT_TEST_CASE(CircularLinkedList) {
  CircularLinkedList<int> list;

  EXPECT(!list.HasHead());

  list.Add(1);
  EXPECT(list.HasHead());
  EXPECT(list.head() == 1);


  // Test: Inserts don't move head.
  for (int i = 2; i <= 100; i++) {
    list.Add(i);
    EXPECT(list.head() == 1);
  }


  // Test: Rotate cycle through all elements in insertion order.
  for (int i = 1; i <= 100; i++) {
    EXPECT(list.HasHead());
    EXPECT(list.head() == i);
    list.Rotate();
  }


  // Test: Removing head results in next element to be head.
  for (int i = 1; i <= 100; i++) {
    list.RemoveHead();
    for (int j = i + 1; j <= 100; j++) {
      EXPECT(list.HasHead());
      EXPECT(list.head() == j);
      list.Rotate();
    }
  }

  // Test: Removing all items individually make list empty.
  EXPECT(!list.HasHead());


  // Test: Removing all items at once makes list empty.
  for (int i = 1; i <= 100; i++) {
    list.Add(i);
  }
  list.RemoveAll();
  EXPECT(!list.HasHead());


  // Test: Remove individual items just deletes them without modifying head.
  for (int i = 1; i <= 10; i++) {
    list.Add(i);
  }
  for (int i = 2; i <= 9; i++) {
    list.Remove(i);
  }
  EXPECT(list.head() == 1);
  list.Rotate();
  EXPECT(list.head() == 10);
  list.Rotate();
  EXPECT(list.head() == 1);


  // Test: Remove non-existent element leaves list un-changed.
  list.Remove(4242);
  EXPECT(list.head() == 1);


  // Test: Remove head element individually moves head to next element.
  list.Remove(1);
  EXPECT(list.HasHead());
  EXPECT(list.head() == 10);
  list.Remove(10);
  EXPECT(!list.HasHead());


  // Test: Remove non-existent element from empty list works.
  list.Remove(4242);
}

}  // namespace bin
}  // namespace dart
