// Copyright (c) 2013, 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 operators.
library test.operator_test;

import 'dart:mirrors';

import 'package:expect/expect.dart';

import 'stringify.dart';

class Foo {
  Foo operator ~() => this;
  Foo operator -() => this;

  bool operator ==(a) => false;
  Foo operator [](int a) => this;
  Foo operator *(Foo a) => this;
  Foo operator /(Foo a) => this;
  Foo operator %(Foo a) => this;
  Foo operator ~/(Foo a) => this;
  Foo operator +(Foo a) => this;
  Foo operator <<(Foo a) => this;
  Foo operator >>(Foo a) => this;
  Foo operator >=(Foo a) => this;
  Foo operator >(Foo a) => this;
  Foo operator <=(Foo a) => this;
  Foo operator <(Foo a) => this;
  Foo operator &(Foo a) => this;
  Foo operator ^(Foo a) => this;
  Foo operator |(Foo a) => this;
  Foo operator -(Foo a) => this;

  // TODO(ahe): use void when dart2js reifies that type.
  operator []=(int a, Foo b) {}
}

void main() {
  ClassMirror cls = reflectClass(Foo);
  var operators = new Map<Symbol, MethodMirror>();
  var operatorParameters = new Map<Symbol, List>();
  var returnTypes = new Map<Symbol, Mirror>();
  for (var method in cls.declarations.values) {
    if (method is MethodMirror) {
      if (!method.isConstructor) {
        Expect.isTrue(method.isRegularMethod);
        Expect.isTrue(method.isOperator);
        Expect.isFalse(method.isGetter);
        Expect.isFalse(method.isSetter);
        Expect.isFalse(method.isAbstract);
        operators[method.simpleName] = method;
        operatorParameters[method.simpleName] = method.parameters;
        returnTypes[method.simpleName] = method.returnType;
      }
    }
  }
  expect(OPERATORS, operators);
  expect(PARAMETERS, operatorParameters);
  expect(RETURN_TYPES, returnTypes);
}

const String OPERATORS =
    '{'
    '%: Method(s(%) in s(Foo)), '
    '&: Method(s(&) in s(Foo)), '
    '*: Method(s(*) in s(Foo)), '
    '+: Method(s(+) in s(Foo)), '
    '-: Method(s(-) in s(Foo)), '
    '/: Method(s(/) in s(Foo)), '
    '<: Method(s(<) in s(Foo)), '
    '<<: Method(s(<<) in s(Foo)), '
    '<=: Method(s(<=) in s(Foo)), '
    '==: Method(s(==) in s(Foo)), '
    '>: Method(s(>) in s(Foo)), '
    '>=: Method(s(>=) in s(Foo)), '
    '>>: Method(s(>>) in s(Foo)), '
    '[]: Method(s([]) in s(Foo)), '
    '[]=: Method(s([]=) in s(Foo)), '
    '^: Method(s(^) in s(Foo)), '
    'unary-: Method(s(unary-) in s(Foo)), '
    '|: Method(s(|) in s(Foo)), '
    '~: Method(s(~) in s(Foo)), '
    '~/: Method(s(~/) in s(Foo))'
    '}';

const String DYNAMIC = 'Type(s(dynamic), top-level)';

const String FOO = 'Class(s(Foo) in s(test.operator_test), top-level)';

const String INT = 'Class(s(int) in s(dart.core), top-level)';

const String BOOL = 'Class(s(bool) in s(dart.core), top-level)';

const String PARAMETERS =
    '{'
    '%: [Parameter(s(a) in s(%), type = $FOO)], '
    '&: [Parameter(s(a) in s(&), type = $FOO)], '
    '*: [Parameter(s(a) in s(*), type = $FOO)], '
    '+: [Parameter(s(a) in s(+), type = $FOO)], '
    '-: [Parameter(s(a) in s(-), type = $FOO)], '
    '/: [Parameter(s(a) in s(/), type = $FOO)], '
    '<: [Parameter(s(a) in s(<), type = $FOO)], '
    '<<: [Parameter(s(a) in s(<<), type = $FOO)], '
    '<=: [Parameter(s(a) in s(<=), type = $FOO)], '
    '==: [Parameter(s(a) in s(==), type = $DYNAMIC)], '
    '>: [Parameter(s(a) in s(>), type = $FOO)], '
    '>=: [Parameter(s(a) in s(>=), type = $FOO)], '
    '>>: [Parameter(s(a) in s(>>), type = $FOO)], '
    '[]: [Parameter(s(a) in s([]), type = $INT)], '
    '[]=: [Parameter(s(a) in s([]=), type = $INT), '
    'Parameter(s(b) in s([]=), type = $FOO)], '
    '^: [Parameter(s(a) in s(^), type = $FOO)], '
    'unary-: [], '
    '|: [Parameter(s(a) in s(|), type = $FOO)], '
    '~: [], '
    '~/: [Parameter(s(a) in s(~/), type = $FOO)]'
    '}';

const String RETURN_TYPES =
    '{'
    '%: $FOO, '
    '&: $FOO, '
    '*: $FOO, '
    '+: $FOO, '
    '-: $FOO, '
    '/: $FOO, '
    '<: $FOO, '
    '<<: $FOO, '
    '<=: $FOO, '
    '==: $BOOL, '
    '>: $FOO, '
    '>=: $FOO, '
    '>>: $FOO, '
    '[]: $FOO, '
    '[]=: $DYNAMIC, '
    '^: $FOO, '
    'unary-: $FOO, '
    '|: $FOO, '
    '~: $FOO, '
    '~/: $FOO'
    '}';
