// 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.

// Test cascades, issues 7494 (vm), 7689 (dart2js).

main() {
  var a = new Element(null);
  Expect.equals(1, a.path0.length);
  Expect.equals(a, a.path0[0]);

  // Issue 7693: e0 ? e1 : e2..f() parses as (e0 ? e1 : e2)..f().
  Expect.equals(2, a.path1.length);
  Expect.equals(a, a.path1[0]);
  Expect.equals(a, a.path1[1]);

  Expect.equals(1, a.path2.length);  // NPE.

  var b = new Element(a);
  Expect.equals(2, b.path0.length);
  Expect.equals(a, b.path0[0]);
  Expect.equals(b, b.path0[1]);

  Expect.equals(3, b.path1.length);
  Expect.equals(a, b.path1[0]);
  Expect.equals(a, b.path1[1]);
  Expect.equals(b, b.path1[2]);

  Expect.equals(2, b.path2.length);  // NPE.
}


class Element {
  final Element parent;

  Element(this.parent);

  List<Element> get path0 {
    if (parent == null) {
      return <Element>[this];
    } else {
      return parent.path0..add(this);
    }
  }

  List<Element> get path1 {
    return (parent == null) ? <Element>[this] : parent.path1..add(this);
  }

  List<Element> get path2 {
    return (parent == null) ? <Element>[this] : (parent.path2..add(this));
  }
}
