// Copyright (c) 2020, 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 that optimization of named parameters doesn't change evaluation order.

// @dart = 2.9

import 'dart:math';
import 'package:expect/expect.dart';

int global = 0;

int inc() => ++global;
int dec() => global = max(0, --global);

// When converting named parameters to positional parameters, we
// follow alphabetical order. Ensure that argument evaluation order
// is unchanged.
void testNamedOrder(int w, {int z, int y, int x}) {
  Expect.equals(w, 1);
  Expect.equals(z, 2);
  Expect.equals(y, 3);
  Expect.equals(x, 2);
}

class TestNamedOrderBase {
  TestNamedOrderBase(w, {int z, int y, int x}) {
    testNamedOrder(w, z: z, y: y, x: x);
  }
}

class TestNamedOrderSub extends TestNamedOrderBase {
  int x;
  TestNamedOrderSub()
      : x = dec(),
        super(inc(), z: inc(), y: inc(), x: dec()) {
    Expect.equals(x, 0);
  }
}

main() {
  testNamedOrder(inc(), z: inc(), y: inc(), x: dec());
  global = 1;
  TestNamedOrderSub();
}
