<!DOCTYPE html>
<!--
@license
Copyright (C) 2017 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-overlay</title>

<script src="../../../bower_components/page/page.js"></script>
<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-overlay.html">

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

<test-fixture id="basic">
  <template>
    <gr-overlay>
      <div>content</div>
    </gr-overlay>
  </template>
</test-fixture>

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

    setup(() => {
      sandbox = sinon.sandbox.create();
      element = fixture('basic');
    });

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

    test('events are fired on fullscreen view', done => {
      sandbox.stub(element, '_isMobile').returns(true);
      const openHandler = sandbox.stub();
      const closeHandler = sandbox.stub();
      element.addEventListener('fullscreen-overlay-opened', openHandler);
      element.addEventListener('fullscreen-overlay-closed', closeHandler);

      element.open().then(() => {
        assert.isTrue(element._isMobile.called);
        assert.isTrue(element._fullScreenOpen);
        assert.isTrue(openHandler.called);

        element._close();
        assert.isFalse(element._fullScreenOpen);
        assert.isTrue(closeHandler.called);
        done();
      });
    });

    test('events are not fired on desktop view', done => {
      sandbox.stub(element, '_isMobile').returns(false);
      const openHandler = sandbox.stub();
      const closeHandler = sandbox.stub();
      element.addEventListener('fullscreen-overlay-opened', openHandler);
      element.addEventListener('fullscreen-overlay-closed', closeHandler);

      element.open().then(() => {
        assert.isTrue(element._isMobile.called);
        assert.isFalse(element._fullScreenOpen);
        assert.isFalse(openHandler.called);

        element._close();
        assert.isFalse(element._fullScreenOpen);
        assert.isFalse(closeHandler.called);
        done();
      });
    });
  });
</script>
