Javascript  |  177行  |  5.67 KB

// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

define([
    "gin/test/expect",
    "mojo/public/interfaces/bindings/tests/sample_service.mojom",
    "mojo/public/interfaces/bindings/tests/sample_import.mojom",
    "mojo/public/interfaces/bindings/tests/sample_import2.mojom",
    "mojo/public/js/connection",
    "mojo/public/js/core",
    "mojo/public/js/threading",
  ], function(expect, sample, imported, imported2, connection, core,
              threading) {
  testDefaultValues()
      .then(testSampleService)
      .then(function() {
    this.result = "PASS";
    threading.quit();
  }.bind(this)).catch(function(e) {
    this.result = "FAIL: " + (e.stack || e);
    threading.quit();
  }.bind(this));

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

    var foo = new sample.Foo();
    expect(foo.name).toBe("Fooby");
    expect(foo.a).toBeTruthy();
    expect(foo.data).toBeNull();

    var defaults = new sample.DefaultsTest();
    expect(defaults.a0).toBe(-12);
    expect(defaults.a1).toBe(sample.kTwelve);
    expect(defaults.a2).toBe(1234);
    expect(defaults.a3).toBe(34567);
    expect(defaults.a4).toBe(123456);
    expect(defaults.a5).toBe(3456789012);
    expect(defaults.a6).toBe(-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.
    expect(defaults.a7).toBe(9999999999999999999);
    expect(defaults.a8).toBe(0x12345);
    expect(defaults.a9).toBe(-0x12345);
    expect(defaults.a10).toBe(1234);
    expect(defaults.a11).toBe(true);
    expect(defaults.a12).toBe(false);
    expect(defaults.a13).toBe(123.25);
    expect(defaults.a14).toBe(1234567890.123);
    expect(defaults.a15).toBe(1E10);
    expect(defaults.a16).toBe(-1.2E+20);
    expect(defaults.a17).toBe(1.23E-20);
    expect(defaults.a20).toBe(sample.Bar.Type.BOTH);
    expect(defaults.a21).toBeNull();
    expect(defaults.a22).toBeTruthy();
    expect(defaults.a22.shape).toBe(imported.Shape.RECTANGLE);
    expect(defaults.a22.color).toBe(imported2.Color.BLACK);
    expect(defaults.a21).toBeNull();
    expect(defaults.a23).toBe(0xFFFFFFFFFFFFFFFF);
    expect(defaults.a24).toBe(0x123456789);
    expect(defaults.a25).toBe(-0x123456789);

    return Promise.resolve();
  }

  function testSampleService() {
    function ServiceImpl() {
    }

    ServiceImpl.prototype = Object.create(sample.Service.stubClass.prototype);

    ServiceImpl.prototype.frobinate = function(foo, baz, port) {
      checkFoo(foo);
      expect(baz).toBe(sample.Service.BazOptions.EXTRA);
      expect(core.isHandle(port)).toBeTruthy();
      return Promise.resolve({result: 1234});
    };

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

    var sampleServicePipe = core.createMessagePipe();
    var connection0 = new connection.Connection(sampleServicePipe.handle0,
                                                ServiceImpl);
    var connection1 = new connection.Connection(
        sampleServicePipe.handle1, undefined, sample.Service.proxyClass);

    var pipe = core.createMessagePipe();
    var promise = connection1.remote.frobinate(
        foo, sample.Service.BazOptions.EXTRA, pipe.handle0)
            .then(function(response) {
      expect(response.result).toBe(1234);

      return Promise.resolve();
    });

    return promise;
  }

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

    var extra_bars = new Array(3);
    for (var i = 0; i < extra_bars.length; ++i) {
      var base = i * 100;
      var type = i % 2 ?
          sample.Bar.Type.VERTICAL : sample.Bar.Type.HORIZONTAL;
      extra_bars[i] = new sample.Bar();
      extra_bars[i].alpha = base;
      extra_bars[i].beta = base + 20;
      extra_bars[i].gamma = base + 40;
      extra_bars[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.extra_bars = extra_bars;
    foo.data = data;

    // TODO(yzshen): currently setting it to null will cause connection error,
    // even if the field is defined as nullable. crbug.com/575753
    foo.source = core.createMessagePipe().handle0;

    return foo;
  }

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

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

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

    expect(core.isHandle(foo.source)).toBeTruthy();
  }
});