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

// This test verifies that `f<a,EXPR>(x)` is properly parsed as a pair of
// expressions separated by a `,`, for all types of expressions that may appear
// as EXPR that can't be parsed as types.

import '../syntax_helper.dart';

class C extends SyntaxTracker {
  C([Object x = absent, Object y = absent])
      : super('new C${SyntaxTracker.args(x, y)}');

  C.syntax(String s) : super(s);

  Object operator >(Object other) =>
      SyntaxTracker('(${syntax(this)} > ${syntax(other)})');
}

class ThisTest extends C {
  ThisTest() : super.syntax('this');

  void test() {
    checkSyntax(f(x < C, this > (x)), 'f((x < C), (this > x))');
    // Note: SyntaxTracker can't see the parens around `this` in the line below
    checkSyntax(f(x < C, (this) > (x)), 'f((x < C), (this > x))');
  }
}

class SuperTest extends C {
  SuperTest() : super.syntax('super');

  void test() {
    checkSyntax(f(x < C, super > (x)), 'f((x < C), (super > x))');
  }
}

main() {
  const y = 123;
  SyntaxTracker.known[C] = 'C';
  SyntaxTracker.known[#x] = '#x';
  SyntaxTracker.known[y] = 'y';
  checkSyntax(
      f(x < C, x.getter.getter > (x)), 'f((x < C), (x.getter.getter > x))');
  checkSyntax(f(x < C, C() > (x)), 'f((x < C), (new C() > x))');
  checkSyntax(f(x < C, new C() > (x)), 'f((x < C), (new C() > x))');
  checkSyntax(f(x < C, f() > (x)), 'f((x < C), (f() > x))');
  checkSyntax(f(x < C, x.method() > (x)), 'f((x < C), (x.method() > x))');
  checkSyntax(f(x < C, x[0]() > (x)), 'f((x < C), (x[0]() > x))');
  checkSyntax(f(x < C, #x > (x)), 'f((x < C), (#x > x))');
  checkSyntax(f(x < C, null > (x)), 'f((x < C), (null > x))');
  checkSyntax(f(x < C, 0 > (y)), 'f((x < C), false)');
  checkSyntax(f(x < C, 0.5 > (y)), 'f((x < C), false)');
  checkSyntax(f(x < C, [] > (x)), 'f((x < C), ([] > x))');
  checkSyntax(f(x < C, [0] > (x)), 'f((x < C), ([0] > x))');
  checkSyntax(f(x < C, {} > (x)), 'f((x < C), ({} > x))');
  checkSyntax(f(x < C, {0} > (x)), 'f((x < C), ({0} > x))');
  checkSyntax(f(x < C, {0: 0} > (x)), 'f((x < C), ({ 0: 0 } > x))');
  checkSyntax(f(x < C, true > (x)), 'f((x < C), (true > x))');
  checkSyntax(f(x < C, "s" > (x)), 'f((x < C), ("s" > x))');
  checkSyntax(f(x < C, r"s" > (x)), 'f((x < C), ("s" > x))');
  checkSyntax(f(x < C, x[0] > (x)), 'f((x < C), (x[0] > x))');
  // Note: SyntaxTracker can't see the parens around `x` in the line below
  checkSyntax(f(x < C, (x) > (x)), 'f((x < C), (x > x))');
  checkSyntax(f(x < C, -x > (x)), 'f((x < C), ((-x) > x))');
  checkSyntax(f(x < C, !true > (x)), 'f((x < C), (false > x))');
  checkSyntax(f(x < C, !(true) > (x)), 'f((x < C), (false > x))');
  checkSyntax(f(x < C, ~x > (x)), 'f((x < C), ((~x) > x))');
  checkSyntax(f(x < C, x * x > (x)), 'f((x < C), ((x * x) > x))');
  checkSyntax(f(x < C, x / x > (x)), 'f((x < C), ((x / x) > x))');
  checkSyntax(f(x < C, x ~/ x > (x)), 'f((x < C), ((x ~/ x) > x))');
  checkSyntax(f(x < C, x % x > (x)), 'f((x < C), ((x % x) > x))');
  checkSyntax(f(x < C, x + x > (x)), 'f((x < C), ((x + x) > x))');
  checkSyntax(f(x < C, x - x > (x)), 'f((x < C), ((x - x) > x))');
  checkSyntax(f(x < C, x << x > (x)), 'f((x < C), ((x << x) > x))');
  checkSyntax(f(x < C, x >> x > (x)), 'f((x < C), ((x >> x) > x))');
  checkSyntax(f(x < C, x & x > (x)), 'f((x < C), ((x & x) > x))');
  checkSyntax(f(x < C, x ^ x > (x)), 'f((x < C), ((x ^ x) > x))');
  checkSyntax(f(x < C, x | x > (x)), 'f((x < C), ((x | x) > x))');
  ThisTest().test();
  SuperTest().test();
}
