// Copyright (c) 2021, 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:expect/expect.dart";

// Test the efficient processing of constants that are DAGs.
//
// This test requires processing a constant that is a DAG of N nodes (N=40). If
// the DAG is traversed as a tree, it will require exponential node visits and
// take time O(2^N) i.e. 2^40, and the test will time out.

main() {
  Expect.equals(40, n40.lengthA);
  Expect.equals(40, n40.lengthB);
}

class Node {
  final Node a;
  final Node b;
  const Node(this.a, this.b);

  int get lengthA => a == null ? 0 : 1 + a.lengthA;
  int get lengthB => b == null ? 0 : 1 + b.lengthB;
}

const n0 = Node(null, null);
const n1 = Node(n0, n0);
const n2 = Node(n1, n1);
const n3 = Node(n2, n2);
const n4 = Node(n3, n3);
const n5 = Node(n4, n4);
const n6 = Node(n5, n5);
const n7 = Node(n6, n6);
const n8 = Node(n7, n7);
const n9 = Node(n8, n8);
const n10 = Node(n9, n9);
const n11 = Node(n10, n10);
const n12 = Node(n11, n11);
const n13 = Node(n12, n12);
const n14 = Node(n13, n13);
const n15 = Node(n14, n14);
const n16 = Node(n15, n15);
const n17 = Node(n16, n16);
const n18 = Node(n17, n17);
const n19 = Node(n18, n18);
const n20 = Node(n19, n19);
const n21 = Node(n20, n20);
const n22 = Node(n21, n21);
const n23 = Node(n22, n22);
const n24 = Node(n23, n23);
const n25 = Node(n24, n24);
const n26 = Node(n25, n25);
const n27 = Node(n26, n26);
const n28 = Node(n27, n27);
const n29 = Node(n28, n28);
const n30 = Node(n29, n29);
const n31 = Node(n30, n30);
const n32 = Node(n31, n31);
const n33 = Node(n32, n32);
const n34 = Node(n33, n33);
const n35 = Node(n34, n34);
const n36 = Node(n35, n35);
const n37 = Node(n36, n36);
const n38 = Node(n37, n37);
const n39 = Node(n38, n38);
const n40 = Node(n39, n39);
