/**
 * @license
 * Copyright (C) 2021 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.
 */

import {ChangeInfo, ChangeStatus, TopicName} from '../../api/rest-api';
import '../../test/common-test-setup-karma';
import {
  createChangeViewChange,
  TEST_BRANCH_ID,
  TEST_SUBJECT,
} from '../../test/test-data-generators';
import {queryAll} from '../../test/test-utils';
import './gr-topic-tree-row';
import {GrTopicTreeRow} from './gr-topic-tree-row';

const basicFixture = fixtureFromElement('gr-topic-tree-row');

suite('gr-topic-tree-row tests', () => {
  let element: GrTopicTreeRow;
  const change: ChangeInfo = {
    ...createChangeViewChange(),
    insertions: 50,
    topic: 'myTopic' as TopicName,
  };

  setup(async () => {
    element = basicFixture.instantiate();
    element.change = change;
    await element.updateComplete;
  });

  test('shows columns of change information', () => {
    const columns = queryAll<HTMLTableCellElement>(element, 'td');
    assert.equal(columns[0].textContent, 'M');
    assert.equal(columns[1].textContent, TEST_SUBJECT);
    assert.equal(columns[2].textContent, 'myTopic');
    assert.equal(columns[3].textContent, TEST_BRANCH_ID);
    assert.equal(columns[4].textContent, 'Test name');
    assert.equal(columns[5].textContent, ChangeStatus.NEW);
  });

  test('shows unknown size', async () => {
    element.change = {...change, insertions: 0, deletions: 0};
    await element.updateComplete;

    const columns = queryAll<HTMLTableCellElement>(element, 'td');
    assert.equal(columns[0].textContent, '');
  });

  test('shows XS size', async () => {
    element.change = {...change, insertions: 3, deletions: 6};
    await element.updateComplete;

    const columns = queryAll<HTMLTableCellElement>(element, 'td');
    assert.equal(columns[0].textContent, 'XS');
  });

  test('shows S size', async () => {
    element.change = {...change, insertions: 9, deletions: 40};
    await element.updateComplete;

    const columns = queryAll<HTMLTableCellElement>(element, 'td');
    assert.equal(columns[0].textContent, 'S');
  });

  test('shows M size', async () => {
    element.change = {...change, insertions: 249, deletions: 0};
    await element.updateComplete;

    const columns = queryAll<HTMLSpanElement>(element, 'td');
    assert.equal(columns[0].textContent, 'M');
  });

  test('shows L size', async () => {
    element.change = {...change, insertions: 499, deletions: 500};
    await element.updateComplete;

    const columns = queryAll<HTMLTableCellElement>(element, 'td');
    assert.equal(columns[0].textContent, 'L');
  });

  test('shows XL size', async () => {
    element.change = {...change, insertions: 1000, deletions: 1};
    await element.updateComplete;

    const columns = queryAll<HTMLTableCellElement>(element, 'td');
    assert.equal(columns[0].textContent, 'XL');
  });
});
