<!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-theme-api</title>

<script src="/node_modules/@webcomponents/webcomponentsjs/custom-elements-es5-adapter.js"></script>

<script src="/node_modules/@webcomponents/webcomponentsjs/webcomponents-lite.js"></script>
<script src="/components/wct-browser-legacy/browser.js"></script>
<script type="module" src="../../../test/test-pre-setup.js"></script>
<script type="module" src="../../../test/common-test-setup.js"></script>
<script type="module" src="../gr-endpoint-decorator/gr-endpoint-decorator.js"></script>
<script type="module" src="./gr-theme-api.js"></script>

<script type="module">
import '../../../test/test-pre-setup.js';
import '../../../test/common-test-setup.js';
import '../gr-endpoint-decorator/gr-endpoint-decorator.js';
import './gr-theme-api.js';
void(0);
</script>

<test-fixture id="header-title">
  <template>
    <gr-endpoint-decorator name="header-title">
      <span class="titleText"></span>
    </gr-endpoint-decorator>
  </template>
</test-fixture>

<script type="module">
import '../../../test/test-pre-setup.js';
import '../../../test/common-test-setup.js';
import '../gr-endpoint-decorator/gr-endpoint-decorator.js';
import './gr-theme-api.js';
suite('gr-theme-api tests', () => {
  let sandbox;
  let theme;

  setup(() => {
    sandbox = sinon.sandbox.create();
    let plugin;
    Gerrit.install(p => { plugin = p; }, '0.1',
        'http://test.com/plugins/testplugin/static/test.js');
    theme = plugin.theme();
  });

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

  test('exists', () => {
    assert.isOk(theme);
  });

  suite('header-title', () => {
    let customHeader;

    setup(() => {
      fixture('header-title');
      stub('gr-custom-plugin-header', {
        /** @override */
        ready() { customHeader = this; },
      });
      Gerrit._loadPlugins([]);
    });

    test('sets logo and title', done => {
      theme.setHeaderLogoAndTitle('foo.jpg', 'bar');
      flush(() => {
        assert.isNotNull(customHeader);
        assert.equal(customHeader.logoUrl, 'foo.jpg');
        assert.equal(customHeader.title, 'bar');
        done();
      });
    });
  });
});
</script>
