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

// @dart = 2.9

// Tests syntax edge cases.
import 'package:expect/expect.dart';

void main() {
  // Trailing comma after then.
  Expect.listEquals([1], [if (true) 1,]);
  Expect.mapEquals({1: 1}, {if (true) 1: 1,});
  Expect.setEquals({1}, {if (true) 1,});

  // Trailing comma after else.
  Expect.listEquals([1], [if (true) 1 else 2,]);
  Expect.mapEquals({1: 1}, {if (true) 1: 1 else 2: 2,});
  Expect.setEquals({1}, {if (true) 1 else 2,});

  // Trailing comma after for.
  Expect.listEquals([1], [1, for (; false;) 2,]);
  Expect.mapEquals({1: 1}, {1: 1, for (; false;) 2: 2,});
  Expect.setEquals({1}, {1, for (; false;) 2,});

  // Dangling else.
  Expect.listEquals([1], [if (true) if (false) 0 else 1]);
  Expect.listEquals([1], [if (true) if (false) 0 else 1 else 2]);
  Expect.listEquals([2], [if (false) if (false) 0 else 1 else 2]);

  // Precedence of then.
  Expect.listEquals([1, 2, 3], [1, if (true) true ? 2 : 0, 3]);
  var a = 0;
  Expect.listEquals([1, 2, 3], [1, if (true) a = 2, 3]);

  // Precedence of else.
  Expect.listEquals([1, 2, 3], [1, if (false) 0 else true ? 2 : 0, 3]);
  a = 0;
  Expect.listEquals([1, 2, 3], [1, if (false) 0 else a = 2, 3]);

  // Precedence of for.
  Expect.listEquals([1, 2, 3],
      [1, for (var i = 0; i < 1; i++) true ? 2 : 0, 3]);
  a = 0;
  Expect.listEquals([1, 2, 3], [1, for (var i = 0; i < 1; i++) a = 2, 3]);
}
