<!DOCTYPE html>
<!--
@license
Copyright (C) 2015 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-date-formatter</title>

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

<script src="/node_modules/@webcomponents/webcomponentsjs/webcomponents-lite.js"></script>
<script src="/components/wct-browser-legacy/browser.js"></script>
<script type="module" src="../../../test/test-pre-setup.js"></script>
<script type="module" src="../../../test/common-test-setup.js"></script>
<script type="module" src="../../../scripts/util.js"></script>

<script type="module" src="./gr-date-formatter.js"></script>

<script type="module">
import '../../../test/test-pre-setup.js';
import '../../../test/common-test-setup.js';
import '../../../scripts/util.js';
import './gr-date-formatter.js';
void(0);
</script>

<test-fixture id="basic">
  <template>
    <gr-date-formatter date-str="2015-09-24 23:30:17.033000000"></gr-date-formatter>
  </template>
</test-fixture>

<script type="module">
import '../../../test/test-pre-setup.js';
import '../../../test/common-test-setup.js';
import '../../../scripts/util.js';
import './gr-date-formatter.js';
suite('gr-date-formatter tests', () => {
  let element;
  let sandbox;

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

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

  /**
   * Parse server-formatter date and normalize into current timezone.
   */
  function normalizedDate(dateStr) {
    const d = util.parseDate(dateStr);
    d.setMinutes(d.getMinutes() + d.getTimezoneOffset());
    return d;
  }

  function testDates(nowStr, dateStr, expected, expectedWithDateAndTime,
      expectedTooltip, done) {
    // Normalize and convert the date to mimic server response.
    dateStr = normalizedDate(dateStr)
        .toJSON()
        .replace('T', ' ')
        .slice(0, -1);
    sandbox.useFakeTimers(normalizedDate(nowStr).getTime());
    element.dateStr = dateStr;
    flush(() => {
      const span = element.shadowRoot
          .querySelector('span');
      assert.equal(span.textContent.trim(), expected);
      assert.equal(element.title, expectedTooltip);
      element.showDateAndTime = true;
      flushAsynchronousOperations();
      assert.equal(span.textContent.trim(), expectedWithDateAndTime);
      done();
    });
  }

  function stubRestAPI(preferences) {
    const loggedInPromise = Promise.resolve(preferences !== null);
    const preferencesPromise = Promise.resolve(preferences);
    stub('gr-rest-api-interface', {
      getLoggedIn: sinon.stub().returns(loggedInPromise),
      getPreferences: sinon.stub().returns(preferencesPromise),
    });
    return Promise.all([loggedInPromise, preferencesPromise]);
  }

  suite('STD + 24 hours time format preference', () => {
    setup(() => stubRestAPI({
      time_format: 'HHMM_24',
      date_format: 'STD',
      relative_date_in_change_table: false,
    }).then(() => {
      element = fixture('basic');
      sandbox.stub(element, '_getUtcOffsetString').returns('');
      return element._loadPreferences();
    }));

    test('invalid dates are quietly rejected', () => {
      assert.notOk((new Date('foo')).valueOf());
      assert.equal(element._computeDateStr('foo', 'h:mm A'), '');
    });

    test('Within 24 hours on same day', done => {
      testDates('2015-07-29 20:34:14.985000000',
          '2015-07-29 15:34:14.985000000',
          '15:34',
          '15:34',
          'Jul 29, 2015, 15:34:14', done);
    });

    test('Within 24 hours on different days', done => {
      testDates('2015-07-29 03:34:14.985000000',
          '2015-07-28 20:25:14.985000000',
          'Jul 28',
          'Jul 28 20:25',
          'Jul 28, 2015, 20:25:14', done);
    });

    test('More than 24 hours but less than six months', done => {
      testDates('2015-07-29 20:34:14.985000000',
          '2015-06-15 03:25:14.985000000',
          'Jun 15',
          'Jun 15 03:25',
          'Jun 15, 2015, 03:25:14', done);
    });

    test('More than six months', done => {
      testDates('2015-09-15 20:34:00.000000000',
          '2015-01-15 03:25:00.000000000',
          'Jan 15, 2015',
          'Jan 15, 2015 03:25',
          'Jan 15, 2015, 03:25:00', done);
    });
  });

  suite('US + 24 hours time format preference', () => {
    setup(() => stubRestAPI({
      time_format: 'HHMM_24',
      date_format: 'US',
      relative_date_in_change_table: false,
    }).then(() => {
      element = fixture('basic');
      sandbox.stub(element, '_getUtcOffsetString').returns('');
      return element._loadPreferences();
    }));

    test('Within 24 hours on same day', done => {
      testDates('2015-07-29 20:34:14.985000000',
          '2015-07-29 15:34:14.985000000',
          '15:34',
          '15:34',
          '07/29/15, 15:34:14', done);
    });

    test('Within 24 hours on different days', done => {
      testDates('2015-07-29 03:34:14.985000000',
          '2015-07-28 20:25:14.985000000',
          '07/28',
          '07/28 20:25',
          '07/28/15, 20:25:14', done);
    });

    test('More than 24 hours but less than six months', done => {
      testDates('2015-07-29 20:34:14.985000000',
          '2015-06-15 03:25:14.985000000',
          '06/15',
          '06/15 03:25',
          '06/15/15, 03:25:14', done);
    });
  });

  suite('ISO + 24 hours time format preference', () => {
    setup(() => stubRestAPI({
      time_format: 'HHMM_24',
      date_format: 'ISO',
      relative_date_in_change_table: false,
    }).then(() => {
      element = fixture('basic');
      sandbox.stub(element, '_getUtcOffsetString').returns('');
      return element._loadPreferences();
    }));

    test('Within 24 hours on same day', done => {
      testDates('2015-07-29 20:34:14.985000000',
          '2015-07-29 15:34:14.985000000',
          '15:34',
          '15:34',
          '2015-07-29, 15:34:14', done);
    });

    test('Within 24 hours on different days', done => {
      testDates('2015-07-29 03:34:14.985000000',
          '2015-07-28 20:25:14.985000000',
          '07-28',
          '07-28 20:25',
          '2015-07-28, 20:25:14', done);
    });

    test('More than 24 hours but less than six months', done => {
      testDates('2015-07-29 20:34:14.985000000',
          '2015-06-15 03:25:14.985000000',
          '06-15',
          '06-15 03:25',
          '2015-06-15, 03:25:14', done);
    });
  });

  suite('EURO + 24 hours time format preference', () => {
    setup(() => stubRestAPI({
      time_format: 'HHMM_24',
      date_format: 'EURO',
      relative_date_in_change_table: false,
    }).then(() => {
      element = fixture('basic');
      sandbox.stub(element, '_getUtcOffsetString').returns('');
      return element._loadPreferences();
    }));

    test('Within 24 hours on same day', done => {
      testDates('2015-07-29 20:34:14.985000000',
          '2015-07-29 15:34:14.985000000',
          '15:34',
          '15:34',
          '29.07.2015, 15:34:14', done);
    });

    test('Within 24 hours on different days', done => {
      testDates('2015-07-29 03:34:14.985000000',
          '2015-07-28 20:25:14.985000000',
          '28. Jul',
          '28. Jul 20:25',
          '28.07.2015, 20:25:14', done);
    });

    test('More than 24 hours but less than six months', done => {
      testDates('2015-07-29 20:34:14.985000000',
          '2015-06-15 03:25:14.985000000',
          '15. Jun',
          '15. Jun 03:25',
          '15.06.2015, 03:25:14', done);
    });
  });

  suite('UK + 24 hours time format preference', () => {
    setup(() => stubRestAPI({
      time_format: 'HHMM_24',
      date_format: 'UK',
      relative_date_in_change_table: false,
    }).then(() => {
      element = fixture('basic');
      sandbox.stub(element, '_getUtcOffsetString').returns('');
      return element._loadPreferences();
    }));

    test('Within 24 hours on same day', done => {
      testDates('2015-07-29 20:34:14.985000000',
          '2015-07-29 15:34:14.985000000',
          '15:34',
          '15:34',
          '29/07/2015, 15:34:14', done);
    });

    test('Within 24 hours on different days', done => {
      testDates('2015-07-29 03:34:14.985000000',
          '2015-07-28 20:25:14.985000000',
          '28/07',
          '28/07 20:25',
          '28/07/2015, 20:25:14', done);
    });

    test('More than 24 hours but less than six months', done => {
      testDates('2015-07-29 20:34:14.985000000',
          '2015-06-15 03:25:14.985000000',
          '15/06',
          '15/06 03:25',
          '15/06/2015, 03:25:14', done);
    });
  });

  suite('STD + 12 hours time format preference', () => {
    setup(() =>
      // relative_date_in_change_table is not set when false.
      stubRestAPI(
          {time_format: 'HHMM_12', date_format: 'STD'}
      ).then(() => {
        element = fixture('basic');
        sandbox.stub(element, '_getUtcOffsetString').returns('');
        return element._loadPreferences();
      })
    );

    test('Within 24 hours on same day', done => {
      testDates('2015-07-29 20:34:14.985000000',
          '2015-07-29 15:34:14.985000000',
          '3:34 PM',
          '3:34 PM',
          'Jul 29, 2015, 3:34:14 PM', done);
    });
  });

  suite('US + 12 hours time format preference', () => {
    setup(() =>
      // relative_date_in_change_table is not set when false.
      stubRestAPI(
          {time_format: 'HHMM_12', date_format: 'US'}
      ).then(() => {
        element = fixture('basic');
        sandbox.stub(element, '_getUtcOffsetString').returns('');
        return element._loadPreferences();
      })
    );

    test('Within 24 hours on same day', done => {
      testDates('2015-07-29 20:34:14.985000000',
          '2015-07-29 15:34:14.985000000',
          '3:34 PM',
          '3:34 PM',
          '07/29/15, 3:34:14 PM', done);
    });
  });

  suite('ISO + 12 hours time format preference', () => {
    setup(() =>
      // relative_date_in_change_table is not set when false.
      stubRestAPI(
          {time_format: 'HHMM_12', date_format: 'ISO'}
      ).then(() => {
        element = fixture('basic');
        sandbox.stub(element, '_getUtcOffsetString').returns('');
        return element._loadPreferences();
      })
    );

    test('Within 24 hours on same day', done => {
      testDates('2015-07-29 20:34:14.985000000',
          '2015-07-29 15:34:14.985000000',
          '3:34 PM',
          '3:34 PM',
          '2015-07-29, 3:34:14 PM', done);
    });
  });

  suite('EURO + 12 hours time format preference', () => {
    setup(() =>
      // relative_date_in_change_table is not set when false.
      stubRestAPI(
          {time_format: 'HHMM_12', date_format: 'EURO'}
      ).then(() => {
        element = fixture('basic');
        sandbox.stub(element, '_getUtcOffsetString').returns('');
        return element._loadPreferences();
      })
    );

    test('Within 24 hours on same day', done => {
      testDates('2015-07-29 20:34:14.985000000',
          '2015-07-29 15:34:14.985000000',
          '3:34 PM',
          '3:34 PM',
          '29.07.2015, 3:34:14 PM', done);
    });
  });

  suite('UK + 12 hours time format preference', () => {
    setup(() =>
      // relative_date_in_change_table is not set when false.
      stubRestAPI(
          {time_format: 'HHMM_12', date_format: 'UK'}
      ).then(() => {
        element = fixture('basic');
        sandbox.stub(element, '_getUtcOffsetString').returns('');
        return element._loadPreferences();
      })
    );

    test('Within 24 hours on same day', done => {
      testDates('2015-07-29 20:34:14.985000000',
          '2015-07-29 15:34:14.985000000',
          '3:34 PM',
          '3:34 PM',
          '29/07/2015, 3:34:14 PM', done);
    });
  });

  suite('relative date preference', () => {
    setup(() => stubRestAPI({
      time_format: 'HHMM_12',
      date_format: 'STD',
      relative_date_in_change_table: true,
    }).then(() => {
      element = fixture('basic');
      sandbox.stub(element, '_getUtcOffsetString').returns('');
      return element._loadPreferences();
    }));

    test('Within 24 hours on same day', done => {
      testDates('2015-07-29 20:34:14.985000000',
          '2015-07-29 15:34:14.985000000',
          '5 hours ago',
          '5 hours ago',
          'Jul 29, 2015, 3:34:14 PM', done);
    });

    test('More than six months', done => {
      testDates('2015-09-15 20:34:00.000000000',
          '2015-01-15 03:25:00.000000000',
          '8 months ago',
          '8 months ago',
          'Jan 15, 2015, 3:25:00 AM', done);
    });
  });

  suite('logged in', () => {
    setup(() => stubRestAPI({
      time_format: 'HHMM_12',
      date_format: 'US',
      relative_date_in_change_table: true,
    }).then(() => {
      element = fixture('basic');
      return element._loadPreferences();
    }));

    test('Preferences are respected', () => {
      assert.equal(element._timeFormat, 'h:mm A');
      assert.equal(element._dateFormat.short, 'MM/DD');
      assert.equal(element._dateFormat.full, 'MM/DD/YY');
      assert.isTrue(element._relative);
    });
  });

  suite('logged out', () => {
    setup(() => stubRestAPI(null).then(() => {
      element = fixture('basic');
      return element._loadPreferences();
    }));

    test('Default preferences are respected', () => {
      assert.equal(element._timeFormat, 'HH:mm');
      assert.equal(element._dateFormat.short, 'MMM DD');
      assert.equal(element._dateFormat.full, 'MMM DD, YYYY');
      assert.isFalse(element._relative);
    });
  });
});
</script>
