<!--
@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.
-->
<!-- Polymer included for the html import polyfill. -->
<script src="/node_modules/@webcomponents/webcomponentsjs/webcomponents-lite.js"></script>
<script src="/components/wct-browser-legacy/browser.js"></script>
<title>gr-path-list-behavior</title>

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

<script type="module">
import '../../test/common-test-setup.js';
import {PathListBehavior} from './gr-path-list-behavior.js';
suite('gr-path-list-behavior tests', () => {
  test('special sort', () => {
    const sort = PathListBehavior.specialFilePathCompare;
    const testFiles = [
      '/a.h',
      '/MERGE_LIST',
      '/a.cpp',
      '/COMMIT_MSG',
      '/asdasd',
      '/mrPeanutbutter.py',
    ];
    assert.deepEqual(
        testFiles.sort(sort),
        [
          '/COMMIT_MSG',
          '/MERGE_LIST',
          '/a.h',
          '/a.cpp',
          '/asdasd',
          '/mrPeanutbutter.py',
        ]);
  });

  test('file display name', () => {
    const name = PathListBehavior.computeDisplayPath;
    assert.equal(name('/foo/bar/baz'), '/foo/bar/baz');
    assert.equal(name('/foobarbaz'), '/foobarbaz');
    assert.equal(name('/COMMIT_MSG'), 'Commit message');
    assert.equal(name('/MERGE_LIST'), 'Merge list');
  });

  test('isMagicPath', () => {
    const isMagic = PathListBehavior.isMagicPath;
    assert.isFalse(isMagic(undefined));
    assert.isFalse(isMagic('/foo.cc'));
    assert.isTrue(isMagic('/COMMIT_MSG'));
    assert.isTrue(isMagic('/MERGE_LIST'));
  });

  test('truncatePath with long path should add ellipsis', () => {
    const truncatePath = PathListBehavior.truncatePath;
    let path = 'level1/level2/level3/level4/file.js';
    let shortenedPath = truncatePath(path);
    // The expected path is truncated with an ellipsis.
    const expectedPath = '\u2026/file.js';
    assert.equal(shortenedPath, expectedPath);

    path = 'level2/file.js';
    shortenedPath = truncatePath(path);
    assert.equal(shortenedPath, expectedPath);
  });

  test('truncatePath with opt_threshold', () => {
    const truncatePath = PathListBehavior.truncatePath;
    let path = 'level1/level2/level3/level4/file.js';
    let shortenedPath = truncatePath(path, 2);
    // The expected path is truncated with an ellipsis.
    const expectedPath = '\u2026/level4/file.js';
    assert.equal(shortenedPath, expectedPath);

    path = 'level2/file.js';
    shortenedPath = truncatePath(path, 2);
    assert.equal(shortenedPath, path);
  });

  test('truncatePath with short path should not add ellipsis', () => {
    const truncatePath = PathListBehavior.truncatePath;
    const path = 'file.js';
    const expectedPath = 'file.js';
    const shortenedPath = truncatePath(path);
    assert.equal(shortenedPath, expectedPath);
  });
});
</script>
