// 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 ~() {}
  Foo operator -() {}

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

  // 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 (MethodMirror method in cls.methods.values) {
    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'
'}';
