// Copyright (c) 2011, 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 test program testing that NoSuchMethod is properly called.

import "package:expect/expect.dart";

class Cat {
  bool eatFood(String food) => true;
  String scratch(String furniture) => 'purr';
}

class MockCat implements Cat {
  dynamic noSuchMethod(Invocation invocation) {
    return (invocation.positionalArguments[0] as String).isNotEmpty;
  }
}


class MockCat2 extends MockCat {
  // this apparently works.
  noSuchMethod(_);
}

class MockCat3 extends MockCat2 implements Cat {
  bool eatFood(String food, {double amount});
  String scratch(String furniture, [String furniture2]);

  dynamic noSuchMethod(Invocation invocation) {
    if (invocation.memberName == #scratch) {
      return invocation.positionalArguments.join(',');
    }

    return (invocation.positionalArguments[0] as String).isNotEmpty &&
        invocation.namedArguments[#amount] > 0.5;
  }
}


class MockWithGenerics {
  /*=T*/ doStuff/*<T>*/(/*=T*/ t);

  noSuchMethod(i) => i.positionalArguments[0] + 100;
}

class MockWithGetterSetter {
  get getter;
  set setter(value);

  Invocation invocation;
  noSuchMethod(i) { invocation = i; }
}


void main() {
  MockCat mock = new MockCat();
  Expect.isTrue((mock as dynamic).eatFood("cat food"));
  Expect.isFalse(mock.eatFood(""));

  // In strong mode this will be a runtime type error:
  // bool is not a String. VM will fail with noSuchMethod +.
  Expect.throws(() => mock.scratch("couch") + '');

  var mock2 = new MockCat2();
  Expect.isTrue(mock2.eatFood("cat food"));

  var mock3 = new MockCat3();
  Expect.isTrue(mock3.eatFood("cat food", amount: 0.9));
  Expect.isFalse(mock3.eatFood("cat food", amount: 0.3));
  Expect.equals(mock3.scratch("chair"), "chair");
  Expect.equals(mock3.scratch("chair", "couch"), "chair,couch");
  Expect.equals(mock3.scratch("chair", null), "chair,null");
  Expect.equals(mock3.scratch("chair", ""), "chair,");

  var g = new MockWithGenerics();
  Expect.equals(g.doStuff(42), 142);
  Expect.throws(() => g.doStuff('hi'));

  var s = new MockWithGetterSetter();
  s.getter;
  Expect.equals(s.invocation.positionalArguments.length, 0);
  Expect.equals(s.invocation.isGetter, true);
  Expect.equals(s.invocation.isSetter, false);
  Expect.equals(s.invocation.isMethod, false);
  s.setter = 42;
  Expect.equals(s.invocation.positionalArguments.single, 42);
  Expect.equals(s.invocation.isGetter, false);
  Expect.equals(s.invocation.isSetter, true);
  Expect.equals(s.invocation.isMethod, false);
}
