<!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-diff-comment-thread-group</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"/>
<script src="../../../scripts/util.js"></script>

<link rel="import" href="gr-diff-comment-thread-group.html">

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

<test-fixture id="basic">
  <template>
    <gr-diff-comment-thread-group></gr-diff-comment-thread-group>
  </template>
</test-fixture>

<script>
  suite('gr-diff-comment-thread-group tests', () => {
    let element;
    let sandbox;

    setup(() => {
      sandbox = sinon.sandbox.create();
      stub('gr-rest-api-interface', {
        getLoggedIn() { return Promise.resolve(false); },
      });
      element = fixture('basic');
    });

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

    test('_getThreads', () => {
      element.patchForNewThreads = 3;
      const comments = [
        {
          id: 'sallys_confession',
          message: 'i like you, jack',
          updated: '2015-12-23 15:00:20.396000000',
          __commentSide: 'left',
        }, {
          id: 'jacks_reply',
          message: 'i like you, too',
          updated: '2015-12-24 15:01:20.396000000',
          __commentSide: 'left',
          in_reply_to: 'sallys_confession',
        },
        {
          id: 'new_draft',
          message: 'i do not like either of you',
          __commentSide: 'left',
          __draft: true,
          updated: '2015-12-20 15:01:20.396000000',
        },
      ];

      let expectedThreadGroups = [
        {
          start_datetime: '2015-12-23 15:00:20.396000000',
          commentSide: 'left',
          comments: [{
            id: 'sallys_confession',
            message: 'i like you, jack',
            updated: '2015-12-23 15:00:20.396000000',
            __commentSide: 'left',
          }, {
            id: 'jacks_reply',
            message: 'i like you, too',
            updated: '2015-12-24 15:01:20.396000000',
            __commentSide: 'left',
            in_reply_to: 'sallys_confession',
          }],
          rootId: 'sallys_confession',
          patchNum: 3,
        },
        {
          start_datetime: '2015-12-20 15:01:20.396000000',
          commentSide: 'left',
          comments: [
            {
              id: 'new_draft',
              message: 'i do not like either of you',
              __commentSide: 'left',
              __draft: true,
              updated: '2015-12-20 15:01:20.396000000',
            },
          ],
          rootId: 'new_draft',
          patchNum: 3,
        },
      ];

      assert.deepEqual(element._getThreads(comments), expectedThreadGroups);

      // Patch num should get inherited from comment rather
      comments.push({
        id: 'betsys_confession',
        message: 'i like you, jack',
        updated: '2015-12-24 15:00:10.396000000',
        range: {
          start_line: 1,
          start_character: 1,
          end_line: 1,
          end_character: 2,
        },
        __commentSide: 'left',
      });

      expectedThreadGroups = [
        {
          start_datetime: '2015-12-23 15:00:20.396000000',
          commentSide: 'left',
          comments: [{
            id: 'sallys_confession',
            message: 'i like you, jack',
            updated: '2015-12-23 15:00:20.396000000',
            __commentSide: 'left',
          }, {
            id: 'jacks_reply',
            in_reply_to: 'sallys_confession',
            message: 'i like you, too',
            updated: '2015-12-24 15:01:20.396000000',
            __commentSide: 'left',
          }],
          patchNum: 3,
          rootId: 'sallys_confession',
        },
        {
          start_datetime: '2015-12-24 15:00:10.396000000',
          commentSide: 'left',
          comments: [{
            id: 'betsys_confession',
            message: 'i like you, jack',
            updated: '2015-12-24 15:00:10.396000000',
            range: {
              start_line: 1,
              start_character: 1,
              end_line: 1,
              end_character: 2,
            },
            __commentSide: 'left',
          }],
          patchNum: 3,
          rootId: 'betsys_confession',
          range: {
            start_line: 1,
            start_character: 1,
            end_line: 1,
            end_character: 2,
          },
        },
        {
          start_datetime: '2015-12-20 15:01:20.396000000',
          commentSide: 'left',
          comments: [
            {
              id: 'new_draft',
              message: 'i do not like either of you',
              __commentSide: 'left',
              __draft: true,
              updated: '2015-12-20 15:01:20.396000000',
            },
          ],
          rootId: 'new_draft',
          patchNum: 3,
        },
      ];

      assert.deepEqual(element._getThreads(comments), expectedThreadGroups);
    });

    test('getThread', () => {
      const range = {
        start_line: 1,
        start_character: 1,
        end_line: 1,
        end_character: 2,
      };
      element.comments = [
        {
          id: 'sallys_confession',
          message: 'i like you, jack',
          updated: '2015-12-23 15:00:20.396000000',
          __commentSide: 'left',
        }, {
          id: 'jacks_reply',
          message: 'i like you, too',
          updated: '2015-12-24 15:01:20.396000000',
          __commentSide: 'left',
          in_reply_to: 'sallys_confession',
        }, {
          id: 'new_draft',
          message: 'i do not like either of you',
          __commentSide: 'left',
          __draft: true,
          in_reply_to: 'sallys_confession',
          updated: '2015-12-20 15:01:20.396000000',
        }, {
          id: 'right_side_comment',
          message: 'right side comment',
          __commentSide: 'right',
          __draft: true,
          updated: '2015-12-20 15:01:20.396000000',
        }, {
          id: 'betsys_confession',
          message: 'i like you more, jack',
          updated: '2015-12-24 15:00:10.396000000',
          range,
          __commentSide: 'left',
        },
      ];

      flushAsynchronousOperations();
      assert.deepEqual(element.getThread('right').rootId, 'right_side_comment');
      assert.deepEqual(element.getThread('right').comments.length, 1);
      assert.deepEqual(element.getThread('left').rootId, 'sallys_confession');
      assert.deepEqual(element.getThread('left').comments.length, 3);
      assert.deepEqual(element.getThread('left', range).rootId,
          'betsys_confession');
      assert.deepEqual(element.getThread('left', range).comments.length, 1);
    });

    test('multiple comments at same location but not threaded', () => {
      element.patchForNewThreads = 3;
      const comments = [
        {
          id: 'sallys_confession',
          message: 'i like you, jack',
          updated: '2015-12-23 15:00:20.396000000',
          __commentSide: 'left',
        }, {
          id: 'jacks_reply',
          message: 'i like you, too',
          updated: '2015-12-24 15:01:20.396000000',
          __commentSide: 'left',
        },
      ];
      assert.equal(element._getThreads(comments).length, 2);
    });

    test('_sortByDate', () => {
      let threadGroups = [
        {
          start_datetime: '2015-12-23 15:00:20.396000000',
          comments: [],
          locationRange: 'line',
        },
        {
          start_datetime: '2015-12-22 15:00:10.396000000',
          comments: [],
          locationRange: 'range-1-1-1-2',
        },
      ];

      let expectedResult = [
        {
          start_datetime: '2015-12-22 15:00:10.396000000',
          comments: [],
          locationRange: 'range-1-1-1-2',
        }, {
          start_datetime: '2015-12-23 15:00:20.396000000',
          comments: [],
          locationRange: 'line',
        },
      ];

      assert.deepEqual(element._sortByDate(threadGroups), expectedResult);

      // When a comment doesn't have a date, the one without the date should be
      // last.
      threadGroups = [
        {
          start_datetime: '2015-12-23 15:00:20.396000000',
          comments: [],
          locationRange: 'line',
        },
        {
          comments: [],
          locationRange: 'range-1-1-1-2',
        },
      ];

      expectedResult = [
        {
          start_datetime: '2015-12-23 15:00:20.396000000',
          comments: [],
          locationRange: 'line',
        },
        {
          comments: [],
          locationRange: 'range-1-1-1-2',
        },
      ];

      assert.deepEqual(element._sortByDate(threadGroups), expectedResult);
    });

    test('_calculateLocationRange', () => {
      const comment = {__commentSide: 'left'};
      const range = {
        start_line: 1,
        start_character: 2,
        end_line: 3,
        end_character: 4,
      };
      assert.equal(
          element._calculateLocationRange(range, comment),
          'range-1-2-3-4-left');
    });

    test('thread groups are updated when comments change', () => {
      const commentsChangedStub = sandbox.stub(element, '_commentsChanged');
      element.comments = [];
      element.comments.push({
        id: 'sallys_confession',
        message: 'i like you, jack',
        updated: '2015-12-23 15:00:20.396000000',
      });
      assert(commentsChangedStub.called);
    });

    test('addNewThread', () => {
      const locationRange = 'range-1-2-3-4';
      element._threads = [{locationRange: 'line'}];
      element.addNewThread(locationRange);
      assert(element._threads.length, 2);
    });

    test('_getPatchNum', () => {
      element.patchForNewThreads = 3;
      const comment = {
        id: 'sallys_confession',
        message: 'i like you, jack',
        updated: '2015-12-23 15:00:20.396000000',
      };
      assert.equal(element._getPatchNum(comment), 3);
      comment.patch_set = 4;
      assert.equal(element._getPatchNum(comment), 4);
    });

    test('removeThread', () => {
      const locationRange = 'range-1-2-3-4';
      element._threads = [
        {locationRange: 'range-1-2-3-4', comments: []},
        {locationRange: 'line', comments: []},
      ];
      flushAsynchronousOperations();
      element.removeThread(locationRange);
      flushAsynchronousOperations();
      assert(element._threads.length, 1);
    });

    test('_rangesEqual', () => {
      const range1 =
          {startLine: 123, startChar: 345, endLine: 234, endChar: 456};
      const range2 =
          {startLine: 1, startChar: 2, endLine: 3, endChar: 4};

      assert.isTrue(element._rangesEqual(null, null));
      assert.isTrue(element._rangesEqual(null, undefined));
      assert.isTrue(element._rangesEqual(undefined, null));
      assert.isTrue(element._rangesEqual(undefined, undefined));

      assert.isFalse(element._rangesEqual(range1, null));
      assert.isFalse(element._rangesEqual(null, range1));
      assert.isFalse(element._rangesEqual(range1, range2));

      assert.isTrue(element._rangesEqual(range1, Object.assign({}, range1)));
    });
  });
</script>
