<!DOCTYPE html>
<script src="../resources/testharness.js"></script>
<script src="../resources/testharnessreport.js"></script>
<script src="file:///gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script>
<script src="file:///gen/mojo/public/interfaces/bindings/tests/sample_service.mojom.js"></script>
<script>
'use strict';

// Checks that values are set to the defaults if we don't override them.
test(() => {
  var bar = new sample.Bar();
  assert_equals(bar.alpha, 255);
  assert_equals(bar.type, sample.Bar.Type.VERTICAL);

  var foo = new sample.Foo();
  assert_equals(foo.name, "Fooby");
  assert_true(foo.a);
  assert_equals(foo.data, null);

  var defaults = new sample.DefaultsTest();
  assert_equals(defaults.a0, -12);
  assert_equals(defaults.a1, sample.kTwelve);
  assert_equals(defaults.a2, 1234);
  assert_equals(defaults.a3, 34567);
  assert_equals(defaults.a4, 123456);
  assert_equals(defaults.a5, 3456789012);
  assert_equals(defaults.a6, -111111111111);
  // JS doesn't have a 64 bit integer type so this is just checking that the
  // expected and actual values have the same closest double value.
  assert_equals(defaults.a7, 9999999999999999999);
  assert_equals(defaults.a8, 0x12345);
  assert_equals(defaults.a9, -0x12345);
  assert_equals(defaults.a10, 1234);
  assert_true(defaults.a11);
  assert_false(defaults.a12);
  assert_equals(defaults.a13, 123.25);
  assert_equals(defaults.a14, 1234567890.123);
  assert_equals(defaults.a15, 1E10);
  assert_equals(defaults.a16, -1.2E+20);
  assert_equals(defaults.a17, 1.23E-20);
  assert_equals(defaults.a20, sample.Bar.Type.BOTH);
  assert_equals(defaults.a21, null);
  assert_true(!!defaults.a22);
  assert_equals(defaults.a22.shape, imported.Shape.RECTANGLE);
  assert_equals(defaults.a22.color, imported.Color.BLACK);
  assert_equals(defaults.a23, 0xFFFFFFFFFFFFFFFF);
  assert_equals(defaults.a24, 0x123456789);
  assert_equals(defaults.a25, -0x123456789);
}, 'default values');

promise_test(async () => {
  function ServiceImpl() {
  }

  ServiceImpl.prototype.frobinate = function(foo, baz, port) {
    checkFoo(foo);
    assert_equals(baz, sample.Service.BazOptions.EXTRA);
    assert_true(port.ptr.isBound());
    return Promise.resolve({result: 1234});
  };

  var foo = makeFoo();
  checkFoo(foo);

  var service = new sample.ServicePtr();
  var request = mojo.makeRequest(service);
  var serviceBinding = new mojo.Binding(
      sample.Service, new ServiceImpl(), request);

  var port = new sample.PortPtr();
  mojo.makeRequest(port);
  assert_equals((await service.frobinate(foo, sample.Service.BazOptions.EXTRA,
                                         port)).result, 1234);

}, 'sample service');

done();

function makeFoo() {
  var bar = new sample.Bar();
  bar.alpha = 20;
  bar.beta = 40;
  bar.gamma = 60;
  bar.type = sample.Bar.Type.VERTICAL;

  var extraBars = new Array(3);
  for (var i = 0; i < extraBars.length; ++i) {
    var base = i * 100;
    var type = i % 2 ? sample.Bar.Type.VERTICAL : sample.Bar.Type.HORIZONTAL;
    extraBars[i] = new sample.Bar();
    extraBars[i].alpha = base;
    extraBars[i].beta = base + 20;
    extraBars[i].gamma = base + 40;
    extraBars[i].type = type;
  }

  var data = new Array(10);
  for (var i = 0; i < data.length; ++i) {
    data[i] = data.length - i;
  }

  var foo = new sample.Foo();
  foo.name = "foopy";
  foo.x = 1;
  foo.y = 2;
  foo.a = false;
  foo.b = true;
  foo.c = false;
  foo.bar = bar;
  foo.extraBars = extraBars;
  foo.data = data;

  foo.source = Mojo.createMessagePipe().handle0;

  return foo;
}

// Checks that the given |Foo| is identical to the one made by |makeFoo()|.
function checkFoo(foo) {
  assert_equals(foo.name, "foopy");
  assert_equals(foo.x, 1);
  assert_equals(foo.y, 2);
  assert_false(foo.a);
  assert_true(foo.b);
  assert_false(foo.c);
  assert_equals(foo.bar.alpha, 20);
  assert_equals(foo.bar.beta, 40);
  assert_equals(foo.bar.gamma, 60);
  assert_equals(foo.bar.type, sample.Bar.Type.VERTICAL);

  assert_equals(foo.extraBars.length, 3);
  for (var i = 0; i < foo.extraBars.length; ++i) {
    var base = i * 100;
    var type = i % 2 ?  sample.Bar.Type.VERTICAL : sample.Bar.Type.HORIZONTAL;
    assert_equals(foo.extraBars[i].alpha, base);
    assert_equals(foo.extraBars[i].beta, base + 20);
    assert_equals(foo.extraBars[i].gamma, base + 40);
    assert_equals(foo.extraBars[i].type, type);
  }

  assert_equals(foo.data.length, 10);
  for (var i = 0; i < foo.data.length; ++i)
    assert_equals(foo.data[i], foo.data.length -i);

  assert_true(foo.source instanceof MojoHandle);
}
</script>
