// Copyright (c) 2018, 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.

import 'package:_fe_analyzer_shared/src/util/link.dart' show Link, LinkBuilder;

import 'package:expect/expect.dart' show Expect;

void main() {
  Link<String> strings = const Link<String>().prepend("B").prepend("A");
  Expect.stringEquals("[ A, B ]", "${strings}");
  Expect.stringEquals("[ B, A ]", "${strings.reverse(const Link<String>())}");

  strings = (new LinkBuilder<String>()
        ..addLast("A")
        ..addLast("B"))
      .toLink(const Link<String>());

  Expect.stringEquals("[ A, B ]", "${strings}");
  Expect.stringEquals("[ B, A ]", "${strings.reverse(const Link<String>())}");

  strings = new LinkBuilder<String>()
      .toLink(const Link<String>())
      .prepend("B")
      .prepend("A");

  Expect.stringEquals("[ A, B ]", "${strings}");
  Expect.stringEquals("[ B, A ]", "${strings.reverse(const Link<String>())}");

  strings = const Link<String>()
      .reverse(const Link<String>())
      .prepend("B")
      .prepend("A");
  Expect.stringEquals("[ A, B ]", "${strings}");
  Expect.stringEquals("[ B, A ]", "${strings.reverse(const Link<String>())}");

  strings = (new LinkBuilder<String>()
        ..addLast("A")
        ..addLast("B"))
      .toLink(const Link<String>());

  Expect.stringEquals("[ A, B ]", "${strings}");
  Expect.stringEquals("[ B, A ]", "${strings.reverse(const Link<String>())}");

  Link<int> ints =
      const Link<int>().prepend(1).reverse(const Link<int>()).tail!.prepend(1);
  Expect.stringEquals("[ 1 ]", "${ints}");
}
