<!DOCTYPE html>
<!--
@license
Copyright (C) 2019 The Android Open Source Project

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->

<meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
<title>gr-api-interface</title>

<script src="../../../bower_components/webcomponentsjs/webcomponents-lite.min.js"></script>
<script src="../../../bower_components/web-component-tester/browser.js"></script>
<link rel="import" href="../../../test/common-test-setup.html"/>
<link rel="import" href="../gr-js-api-interface/gr-js-api-interface.html">

<script>void(0);</script>

<test-fixture id="basic">
  <template>
    <gr-js-api-interface></gr-js-api-interface>
  </template>
</test-fixture>

<script>
  suite('gr-event-interface tests', () => {
    let sandbox;

    setup(() => {
      sandbox = sinon.sandbox.create();
    });

    teardown(() => {
      sandbox.restore();
    });

    suite('test on Gerrit', () => {
      setup(() => {
        fixture('basic');
        Gerrit.removeAllListeners();
      });

      test('communicate between plugin and Gerrit', done => {
        const eventName = 'test-plugin-event';
        let p;
        Gerrit.on(eventName, e => {
          assert.equal(e.value, 'test');
          assert.equal(e.plugin, p);
          done();
        });
        Gerrit.install(plugin => {
          p = plugin;
          Gerrit.emit(eventName, {value: 'test', plugin});
        }, '0.1',
        'http://test.com/plugins/testplugin/static/test.js');
      });

      test('listen on events from core', done => {
        const eventName = 'test-plugin-event';
        Gerrit.on(eventName, e => {
          assert.equal(e.value, 'test');
          done();
        });

        Gerrit.emit(eventName, {value: 'test'});
      });

      test('communicate across plugins', done => {
        const eventName = 'test-plugin-event';
        Gerrit.install(plugin => {
          Gerrit.on(eventName, e => {
            assert.equal(e.plugin.getPluginName(), 'testB');
            done();
          });
        }, '0.1',
        'http://test.com/plugins/testA/static/testA.js');

        Gerrit.install(plugin => {
          Gerrit.emit(eventName, {plugin});
        }, '0.1',
        'http://test.com/plugins/testB/static/testB.js');
      });
    });

    suite('test on interfaces', () => {
      let testObj;

      class TestClass extends EventEmitter {
      }

      setup(() => {
        testObj = new TestClass();
      });

      test('on', () => {
        const cbStub = sinon.stub();
        testObj.on('test', cbStub);
        testObj.emit('test');
        testObj.emit('test');
        assert.isTrue(cbStub.calledTwice);
      });

      test('once', () => {
        const cbStub = sinon.stub();
        testObj.once('test', cbStub);
        testObj.emit('test');
        testObj.emit('test');
        assert.isTrue(cbStub.calledOnce);
      });

      test('unsubscribe', () => {
        const cbStub = sinon.stub();
        const unsubscribe = testObj.on('test', cbStub);
        testObj.emit('test');
        unsubscribe();
        testObj.emit('test');
        assert.isTrue(cbStub.calledOnce);
      });

      test('off', () => {
        const cbStub = sinon.stub();
        testObj.on('test', cbStub);
        testObj.emit('test');
        testObj.off('test', cbStub);
        testObj.emit('test');
        assert.isTrue(cbStub.calledOnce);
      });

      test('removeAllListeners', () => {
        const cbStub = sinon.stub();
        testObj.on('test', cbStub);
        testObj.removeAllListeners('test');
        testObj.emit('test');
        assert.isTrue(cbStub.notCalled);
      });
    });
  });
</script>