<!DOCTYPE html>
<!--
@license
Copyright (C) 2016 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-simple-submit-rules-label-config</title>

<script src="../../../polygerrit-ui/app/bower_components/webcomponentsjs/webcomponents-lite.min.js"></script>
<script src="../../../polygerrit-ui/app/bower_components/web-component-tester/browser.js"></script>
<link rel="import"
  href="../../../polygerrit-ui/app/test/common-test-setup.html" />
<!-- TODO(maximeg) find if there is a better way to do this, like .. not in tests -->
<link rel="import"
  href="../../../polygerrit-ui/app/elements/shared/gr-select/gr-select.html" />
<link rel="import"
  href="../../../polygerrit-ui/app/styles/shared-styles.html" />
<link rel="import"
  href="../../../polygerrit-ui/app/styles/gr-form-styles.html" />

<link rel="import"
  href="gr-simple-submit-rules-label-config.html">

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

<test-fixture id="basic">
  <template>
    <gr-simple-submit-rules-label-config label-name="Verified"
      repo-config='{"labels": {"Verified": {"function": "MaxNoBlock", "copy_scores": []}}}'
      readOnly="false">
    </gr-simple-submit-rules-label-config>
  </template>
</test-fixture>

<script>
  const COPY_SCORES = [
    'copyMinScore',
    'copyMaxScore',
    'copyAllScoresOnTrivialRebase',
    'copyAllScoresIfNoCodeChange',
    'copyAllScoresIfNoChange',
    'copyAllScoresOnMergeFirstParentUpdate'
  ];

  suite('gr-simple-submit-rules-label-config tests', () => {
    let element;
    let sandbox;

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

      element = fixture('basic');
    });

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

    test('section title is correct', () => {
      assert.equal(element.$$('#options').innerText.indexOf('Label Verified'), 0);
    });

    // The following tests check that changing the function name (from the REST API)
    // has an impact on the displayed settings
    test('function "MaxWithBlock" is properly mapped to UI', done => {
      element.set('_labelConfig.function', 'MaxWithBlock');

      flush(function () {
        assert.ok(element.$$('#negativeBlocks').checked);
        assert.ok(element.$$('#maxVoteRequired').checked);
        assert.equal(element.$$('#functionName select').value, 'MaxWithBlock');
        done();
      });
    });

    test('function "MaxNoBlock" is properly mapped to UI', done => {
      element.set('_labelConfig.function', 'MaxNoBlock');

      flush(function () {
        assert.equal(element.$$('#negativeBlocks').checked, false);
        assert.ok(element.$$('#maxVoteRequired').checked);
        assert.equal(element.$$('#functionName select').value, 'MaxNoBlock');
        done();
      });
    });

    test('function "NoBlock" is properly mapped to UI', done => {
      element.set('_labelConfig.function', 'NoBlock');

      flush(function () {
        assert.equal(element.$$('#negativeBlocks').checked, false);
        assert.equal(element.$$('#maxVoteRequired').checked, false);
        assert.equal(element.$$('#functionName select').value, 'NoBlock');
        done();
      });
    });

    test('function "AnyWithBlock" is properly mapped to UI', done => {
      element.set('_labelConfig.function', 'AnyWithBlock');

      flush(function () {
        assert.ok(element.$$('#negativeBlocks').checked);
        assert.equal(element.$$('#maxVoteRequired').checked, false);
        assert.equal(element.$$('#functionName select').value, 'AnyWithBlock');
        done();
      });
    });

    // The following tests check that changing the function from the UI has a
    // visible impact on the easy checkboxes options, while keeping the function
    // name intact.
    test('picking function "MaxWithBlock" correctly updates the UI', done => {
      element.$$('#functionName select').value = 'MaxWithBlock';
      element.$$('#functionName').dispatchEvent(new Event('change'));

      flush(function () {
        assert.ok(element.$$('#negativeBlocks').checked);
        assert.ok(element.$$('#maxVoteRequired').checked);
        assert.equal(element.$$('#functionName select').value, 'MaxWithBlock');
        done();
      });
    });

    test('picking function "NoBlock" correctly updates the UI', done => {
      element.$$('#functionName select').value = 'NoBlock';
      element.$$('#functionName').dispatchEvent(new Event('change'));

      flush(function () {
        assert.equal(element.$$('#negativeBlocks').checked, false);
        assert.equal(element.$$('#maxVoteRequired').checked, false);
        assert.equal(element.$$('#functionName select').value, 'NoBlock');
        done();
      });
    });

    test('picking function "AnyWithBlock" correctly updates the UI', done => {
      element.$$('#functionName select').value = 'AnyWithBlock';
      element.$$('#functionName').dispatchEvent(new Event('change'));

      flush(function () {
        assert.ok(element.$$('#negativeBlocks').checked);
        assert.equal(element.$$('#maxVoteRequired').checked, false);
        assert.equal(element.$$('#functionName select').value, 'AnyWithBlock');
        done();
      });
    });

    test('picking function "MaxNoBlock" correctly updates the UI', done => {
      element.$$('#functionName select').value = 'MaxNoBlock';
      element.$$('#functionName').dispatchEvent(new Event('change'));

      flush(function () {
        assert.equal(element.$$('#negativeBlocks').checked, false);
        assert.ok(element.$$('#maxVoteRequired').checked);
        assert.equal(element.$$('#functionName select').value, 'MaxNoBlock');
        done();
      });
    });

    // The following tests check that the easy way to define the function
    // ("negative blocks?" and "max vote required?") maps to the right function,
    // without impacting the user choices.
    test('function "MaxWithBlock" is properly suggested from UI', done => {
      element.$$('#negativeBlocks').checked = true;
      element.$$('#negativeBlocks').dispatchEvent(new Event('change'));

      element.$$('#maxVoteRequired').checked = 'true';
      element.$$('#maxVoteRequired').dispatchEvent(new Event('change'));

      flush(function () {
        assert.ok(element.$$('#negativeBlocks').checked);
        assert.ok(element.$$('#maxVoteRequired').checked);
        assert.equal(element.$$('#functionName select').value, 'MaxWithBlock');
        done();
      });
    });

    test('function "NoBlock" is properly suggested from UI', done => {
      element.$$('#negativeBlocks').checked = false;
      element.$$('#negativeBlocks').dispatchEvent(new Event('change'));

      element.$$('#maxVoteRequired').checked = false;
      element.$$('#maxVoteRequired').dispatchEvent(new Event('change'));

      flush(function () {
        assert.equal(element.$$('#negativeBlocks').checked, false);
        assert.equal(element.$$('#maxVoteRequired').checked, false);
        assert.equal(element.$$('#functionName select').value, 'NoBlock');
        done();
      });
    });

    test('function "AnyWithBlock" is properly suggested from UI', done => {
      element.$$('#negativeBlocks').checked = true;
      element.$$('#negativeBlocks').dispatchEvent(new Event('change'));

      element.$$('#maxVoteRequired').checked = false;
      element.$$('#maxVoteRequired').dispatchEvent(new Event('change'));

      flush(function () {
        assert.ok(element.$$('#negativeBlocks').checked);
        assert.equal(element.$$('#maxVoteRequired').checked, false);
        assert.equal(element.$$('#functionName select').value, 'AnyWithBlock');
        done();
      });
    });

    test('function "MaxNoBlock" is properly suggested from UI', done => {
      element.$$('#negativeBlocks').checked = false;

      element.$$('#maxVoteRequired').checked = 'true';
      element.$$('#maxVoteRequired').dispatchEvent(new Event('change'));

      flush(function () {
        assert.equal(element.$$('#negativeBlocks').checked, false);
        assert.ok(element.$$('#maxVoteRequired').checked);
        assert.equal(element.$$('#functionName select').value, 'MaxNoBlock');
        done();
      });
    });

    // The following tests check that "copy scores" are correctly mapped *to* and
    // *from* the UI, for the two possible boolean values.
    for (let copyScoreName of COPY_SCORES) {
      let elName = '#' + copyScoreName;

      test('copyScore.' + copyScoreName + ' [false] is reflected *in* the UI', () => {
        assert.equal(element.$$(elName).checked, false);
      });

      test('copyScore.' + copyScoreName + ' [true] is reflected in the UI', done => {
        element.set('_labelConfig.copy_scores', [copyScoreName]);

        flush(function () {
          assert.ok(element.$$(elName).checked);
          done();
        });
      });
    }


    for (let copyScoreName of COPY_SCORES) {
      let elName = '#' + copyScoreName;

      test('copyScore.' + copyScoreName + ' is reflected *from* the UI', done => {
        element.$$(elName).checked = 'true';
        element.$$(elName).dispatchEvent(new Event('change'));

        flush(function () {
          assert.deepEqual(element.repoConfig.labels.Verified.copy_scores, [copyScoreName]);
          done();
        });
      });
    }

  });
</script>
