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

library eval_test;

import 'dart:async';

// Import mirrors to cause all mirrors to be retained by dart2js.
// The tests reflect on LinkedHashMap.length and String.length.
import 'dart:mirrors';

import 'package:polymer_expressions/eval.dart';
import 'package:polymer_expressions/filter.dart';
import 'package:polymer_expressions/parser.dart';
import 'package:unittest/unittest.dart';
import 'package:observe/observe.dart';
import 'package:observe/mirrors_used.dart'; // make test smaller.

main() {
  reflectClass(Object); // suppress unused import warning

  group('eval', () {
    test('should return the model for an empty expression', () {
      expectEval('', 'model', 'model');
    });

    test('should handle the "this" keyword', () {
      expectEval('this', 'model', 'model');
      expectEval('this.name', 'foo', new Foo(name: 'foo'));
      expectEval('this["a"]', 'x', {'a': 'x'});
    });

    test('should return a literal int', () {
      expectEval('1', 1);
      expectEval('+1', 1);
      expectEval('-1', -1);
    });

    test('should return a literal double', () {
      expectEval('1.2', 1.2);
      expectEval('+1.2', 1.2);
      expectEval('-1.2', -1.2);
    });

    test('should return a literal string', () {
      expectEval('"hello"', "hello");
      expectEval("'hello'", "hello");
    });

    test('should return a literal boolean', () {
      expectEval('true', true);
      expectEval('false', false);
    });

    test('should return a literal null', () {
      expectEval('null', null);
    });

    test('should return a literal list', () {
      expectEval('[1, 2, 3]', equals([1, 2, 3]));
    });

    test('should return a literal map', () {
      expectEval('{"a": 1}', equals(new Map.from({'a': 1})));
      expectEval('{"a": 1}', containsPair('a', 1));
    });

    test('should call methods on a literal map', () {
      expectEval('{"a": 1}.length', 1);
    });

    test('should evaluate unary operators', () {
      expectEval('+a', 2, null, {'a': 2});
      expectEval('-a', -2, null, {'a': 2});
      expectEval('!a', false, null, {'a': true});
    });

    test('should evaluate binary operators', () {
      expectEval('1 + 2', 3);
      expectEval('2 - 1', 1);
      expectEval('4 / 2', 2);
      expectEval('2 * 3', 6);

      expectEval('1 == 1', true);
      expectEval('1 == 2', false);
      expectEval('1 == null', false);
      expectEval('1 != 1', false);
      expectEval('1 != 2', true);
      expectEval('1 != null', true);

      expectEval('1 > 1', false);
      expectEval('1 > 2', false);
      expectEval('2 > 1', true);
      expectEval('1 >= 1', true);
      expectEval('1 >= 2', false);
      expectEval('2 >= 1', true);
      expectEval('1 < 1', false);
      expectEval('1 < 2', true);
      expectEval('2 < 1', false);
      expectEval('1 <= 1', true);
      expectEval('1 <= 2', true);
      expectEval('2 <= 1', false);

      expectEval('true || true', true);
      expectEval('true || false', true);
      expectEval('false || true', true);
      expectEval('false || false', false);

      expectEval('true && true', true);
      expectEval('true && false', false);
      expectEval('false && true', false);
      expectEval('false && false', false);
    });

    test('should evaulate ternary operators', () {
      expectEval('true ? 1 : 2', 1);
      expectEval('false ? 1 : 2', 2);
      expectEval('true ? true ? 1 : 2 : 3', 1);
      expectEval('true ? false ? 1 : 2 : 3', 2);
      expectEval('false ? true ? 1 : 2 : 3', 3);
      expectEval('false ? 1 : true ? 2 : 3', 2);
      expectEval('false ? 1 : false ? 2 : 3', 3);
      expectEval('null ? 1 : 2', 2);
      // TODO(justinfagnani): re-enable and check for an EvalError when
      // we implement the final bool conversion rules and this expression
      // throws in both checked and unchecked mode
//      expect(() => eval(parse('42 ? 1 : 2'), null), throws);
    });

    test('should invoke a method on the model', () {
      var foo = new Foo(name: 'foo', age: 2);
      expectEval('x()', foo.x(), foo);
      expectEval('name', foo.name, foo);
    });

    test('should invoke chained methods', () {
      var foo = new Foo(name: 'foo', age: 2);
      expectEval('name.length', foo.name.length, foo);
      expectEval('x().toString()', foo.x().toString(), foo);
      expectEval('name.substring(2)', foo.name.substring(2), foo);
      expectEval('a()()', 1, null, {'a': () => () => 1});
    });

    test('should invoke a top-level function', () {
      expectEval('x()', 42, null, {'x': () => 42});
      expectEval('x(5)', 5, null, {'x': (i) => i});
      expectEval('y(5, 10)', 50, null, {'y': (i, j) => i * j});
    });

    test('should give precedence to top-level functions over methods', () {
      var foo = new Foo(name: 'foo', age: 2);
      expectEval('x()', 42, foo, {'x': () => 42});
    });

    test('should invoke the [] operator', () {
      var map = {'a': 1, 'b': 2};
      expectEval('map["a"]', 1, null, {'map': map});
      expectEval('map["a"] + map["b"]', 3, null, {'map': map});
    });

    test('should call a filter', () {
      var topLevel = {
        'a': 'foo',
        'uppercase': (s) => s.toUpperCase(),
      };
      expectEval('a | uppercase', 'FOO', null, topLevel);
    });

    test('should call a transformer', () {
      var topLevel = {
        'a': '42',
        'parseInt': parseInt,
        'add': add,
      };
      expectEval('a | parseInt()', 42, null, topLevel);
      expectEval('a | parseInt(8)', 34, null, topLevel);
      expectEval('a | parseInt() | add(10)', 52, null, topLevel);
    });

    test('should filter a list', () {
      expectEval('chars1 | filteredList', ['a', 'b'], new WordElement());
    });

    test('should return null if the receiver of a method is null', () {
      expectEval('a.b', null, null, {'a': null});
      expectEval('a.b()', null, null, {'a': null});
    });

    test('should return null if null is invoked', () {
      expectEval('a()', null, null, {'a': null});
    });

    test('should return null if an operand is null', () {
      expectEval('a + b', null, null, {'a': null, 'b': null});
      expectEval('+a', null, null, {'a': null});
    });

    test('should treat null as false', () {
      expectEval('!null', true);
      expectEval('true && null', false);
      expectEval('null || false', false);

      expectEval('!a', true, null, {'a': null});

      expectEval('a && b', false, null, {'a': null, 'b': true});
      expectEval('a && b', false, null, {'a': true, 'b': null});
      expectEval('a && b', false, null, {'a': null, 'b': false});
      expectEval('a && b', false, null, {'a': false, 'b': null});
      expectEval('a && b', false, null, {'a': null, 'b': null});

      expectEval('a || b', true, null, {'a': null, 'b': true});
      expectEval('a || b', true, null, {'a': true, 'b': null});
      expectEval('a || b', false, null, {'a': null, 'b': false});
      expectEval('a || b', false, null, {'a': false, 'b': null});
      expectEval('a || b', false, null, {'a': null, 'b': null});
    });

    test('should evaluate an "in" expression', () {
      var scope = new Scope(variables: {'items': [1, 2, 3]});
      var comprehension = eval(parse('item in items'), scope);
      expect(comprehension.iterable, orderedEquals([1, 2, 3]));
    });

    test('should evaluate complex "in" expressions', () {
      var holder = new ListHolder([1, 2, 3]);
      var scope = new Scope(variables: {'holder': holder});
      var comprehension = eval(parse('item in holder.items'), scope);
      expect(comprehension.iterable, orderedEquals([1, 2, 3]));
    });

    test('should handle null iterators in "in" expressions', () {
      var scope = new Scope(variables: {'items': null});
      var comprehension = eval(parse('item in items'), scope);
      expect(comprehension, isNotNull);
      expect(comprehension.iterable, []);
    });

  });

  group('assign', () {

    test('should assign a single identifier', () {
      var foo = new Foo(name: 'a');
      assign(parse('name'), 'b', new Scope(model: foo));
      expect(foo.name, 'b');
    });

    test('should assign a sub-property', () {
      var child = new Foo(name: 'child');
      var parent = new Foo(child: child);
      assign(parse('child.name'), 'Joe', new Scope(model: parent));
      expect(parent.child.name, 'Joe');
    });

    test('should assign an index', () {
      var foo = new Foo(items: [1, 2, 3]);
      assign(parse('items[0]'), 4, new Scope(model: foo));
      expect(foo.items[0], 4);
    });

    test('should assign through transformers', () {
      var foo = new Foo(name: '42', age: 32);
      var globals = {
        'a': '42',
        'parseInt': parseInt,
        'add': add,
      };
      var scope = new Scope(model: foo, variables: globals);
      assign(parse('age | add(7)'), 29, scope);
      expect(foo.age, 22);
      assign(parse('name | parseInt() | add(10)'), 29, scope);
      expect(foo.name, '19');
    });

  });

  group('scope', () {
    test('should return fields on the model', () {
      var foo = new Foo(name: 'a', age: 1);
      var scope = new Scope(model: foo);
      expect(scope['name'], 'a');
      expect(scope['age'], 1);
    });

    test('should throw for undefined names', () {
      var scope = new Scope();
      expect(() => scope['a'], throwsException);
    });

    test('should return variables', () {
      var scope = new Scope(variables: {'a': 'A'});
      expect(scope['a'], 'A');
    });

    test("should a field from the parent's model", () {
      var parent = new Scope(variables: {'a': 'A', 'b': 'B'});
      var child = parent.childScope('a', 'a');
      expect(child['a'], 'a');
      expect(parent['a'], 'A');
      expect(child['b'], 'B');
    });

  });

  group('observe', () {
    test('should observe an identifier', () {
      var foo = new Foo(name: 'foo');
      return expectObserve('name',
          model: foo,
          beforeMatcher: 'foo',
          mutate: () {
            foo.name = 'fooz';
          },
          afterMatcher: 'fooz'
      );
    });

    test('should observe an invocation', () {
      var foo = new Foo(name: 'foo');
      return expectObserve('foo.name',
          variables: {'foo': foo},
          beforeMatcher: 'foo',
          mutate: () {
            foo.name = 'fooz';
          },
          afterMatcher: 'fooz'
      );
    });

    test('should observe map access', () {
      var foo = toObservable({'one': 'one', 'two': 'two'});
      return expectObserve('foo["one"]',
          variables: {'foo': foo},
          beforeMatcher: 'one',
          mutate: () {
            foo['one'] = '1';
          },
          afterMatcher: '1'
      );
    });

    test('should observe an comprehension', () {
      var items = new ObservableList();
      var foo = new Foo(name: 'foo');
      return expectObserve('item in items',
          variables: {'items': items},
          beforeMatcher: (c) => c.iterable.isEmpty,
          mutate: () {
            items.add(foo);
          },
          afterMatcher: (c) => c.iterable.contains(foo)
      );
    });

  });

}

@reflectable
class Foo extends ChangeNotifier {
  String _name;
  String get name => _name;
  void set name(String n) {
    _name = notifyPropertyChange(#name, _name, n);
  }

  int age;
  Foo child;
  List<int> items;

  Foo({name, this.age, this.child, this.items}) : _name = name;

  int x() => age * age;
}

@reflectable
class ListHolder {
  List items;
  ListHolder(this.items);
}

parseInt([int radix = 10]) => new IntToString(radix: radix);

class IntToString extends Transformer<int, String> {
  final int radix;
  IntToString({this.radix: 10});
  int forward(String s) => int.parse(s, radix: radix);
  String reverse(int i) => '$i';
}

add(int i) => new Add(i);

class Add extends Transformer<int, int> {
  final int i;
  Add(this.i);
  int forward(int x) => x + i;
  int reverse(int x) => x - i;
}

Object evalString(String s, [Object model, Map vars]) =>
    eval(new Parser(s).parse(), new Scope(model: model, variables: vars));

expectEval(String s, dynamic matcher, [Object model, Map vars = const {}]) =>
    expect(
        eval(new Parser(s).parse(), new Scope(model: model, variables: vars)),
        matcher,
        reason: s);

expectObserve(String s, {
    Object model,
    Map variables: const {},
    dynamic beforeMatcher,
    mutate(),
    dynamic afterMatcher}) {

  var scope = new Scope(model: model, variables: variables);
  var observer = observe(new Parser(s).parse(), scope);
  update(observer, scope);
  expect(observer.currentValue, beforeMatcher);
  var passed = false;
  var future = observer.onUpdate.first.then((value) {
    expect(value, afterMatcher);
    expect(observer.currentValue, afterMatcher);
    passed = true;
  });
  mutate();
  // fail if we don't receive an update by the next event loop
  return Future.wait([future, new Future(() {
    expect(passed, true, reason: "Didn't receive a change notification on $s");
  })]);
}

// Regression test from https://code.google.com/p/dart/issues/detail?id=13459
class WordElement extends Observable {
  @observable List chars1 = 'abcdefg'.split('');
  @reflectable List filteredList(List original) => [original[0], original[1]];
}
