<!DOCTYPE html>
<!--
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-confirm-revert-dialog</title>

<script src="../../../bower_components/webcomponentsjs/webcomponents.min.js"></script>
<script src="../../../bower_components/web-component-tester/browser.js"></script>

<link rel="import" href="../../../bower_components/iron-test-helpers/iron-test-helpers.html">
<link rel="import" href="gr-confirm-revert-dialog.html">

<test-fixture id="basic">
  <template>
    <gr-confirm-revert-dialog></gr-confirm-revert-dialog>
  </template>
</test-fixture>

<script>
  suite('gr-confirm-revert-dialog tests', function() {
    var element;

    setup(function() {
      element = fixture('basic');
    });

    test('no match', function() {
      assert.isNotOk(element.message);
      var alertStub = sinon.stub(window, 'alert');
      element.populateRevertMessage('not a change-id in sight');
      assert.isTrue(alertStub.calledOnce);
      alertStub.restore();
    });

    test('single line', function() {
      assert.isNotOk(element.message);
      element.populateRevertMessage('one line commit\n\nChange-Id: abcdefg\n');
      var expected = 'Revert "one line commit"\n\n' +
                     'This reverts commit abcdefg.\n\n' +
                     'Reason for revert: <INSERT REASONING HERE>\n\n' +
                     'Original change\'s description:\n' +
                     '> one line commit\n> \n' +
                     '> Change-Id: abcdefg\n> ';
      assert.equal(element.message, expected);
    });

    test('multi line', function() {
      assert.isNotOk(element.message);
      element.populateRevertMessage(
          'many lines\ncommit\n\nmessage\n\nChange-Id: abcdefg\n');
      var expected = 'Revert "many lines"\n\n' +
                     'This reverts commit abcdefg.\n\n' +
                     'Reason for revert: <INSERT REASONING HERE>\n\n' +
                     'Original change\'s description:\n' +
                     '> many lines\n> commit\n> \n> message\n> \n' +
                     '> Change-Id: abcdefg\n> ';
      assert.equal(element.message, expected);
    });

    test('issue above change id', function() {
      assert.isNotOk(element.message);
      element.populateRevertMessage(
          'much lines\nvery\n\ncommit\n\nBug: Issue 42\nChange-Id: abcdefg\n');
      var expected = 'Revert "much lines"\n\n' +
                     'This reverts commit abcdefg.\n\n' +
                     'Reason for revert: <INSERT REASONING HERE>\n\n' +
                     'Original change\'s description:\n' +
                     '> much lines\n> very\n> \n> commit\n> \n' +
                     '> Bug: Issue 42\n' +
                     '> Change-Id: abcdefg\n> ';
      assert.equal(element.message, expected);
    });

    test('revert a revert', function () {
      assert.isNotOk(element.message);
      element.populateRevertMessage(
          'Revert "one line commit"\n\nChange-Id: abcdefg\n');
      var expected = 'Revert "Revert "one line commit""\n\n' +
                     'This reverts commit abcdefg.\n\n' +
                     'Reason for revert: <INSERT REASONING HERE>\n\n' +
                     'Original change\'s description:\n' +
                     '> Revert "one line commit"\n> \n' +
                     '> Change-Id: abcdefg\n> ';
      assert.equal(element.message, expected);
    });
  });
</script>
