<!DOCTYPE html>
<meta charset=utf-8>
<title>File constructor: endings option</title>
<link rel=help href="https://w3c.github.io/FileAPI/#file-constructor">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script>

// Windows platforms use CRLF as the native line ending. All others use LF.
const crlf = navigator.platform.startsWith('Win');
const native_ending = crlf ? '\r\n' : '\n';

function readBlobAsPromise(blob) {
  return new Promise((resolve, reject) => {
    const reader = new FileReader();
    reader.readAsText(blob);
    reader.onload = e => resolve(reader.result);
    reader.onerror = e => reject(reader.error);
  });
}

[
  'transparent',
  'native'
].forEach(value => test(t => {
  assert_class_string(new File([], "name", {endings: value}), 'File',
                      `Constructor should allow "${value}" endings`);
}, `Valid "endings" value: ${JSON.stringify(value)}`));

[
  null,
  '',
  'invalidEnumValue',
  'Transparent',
  'NATIVE',
  0,
  {}
].forEach(value => test(t => {
  assert_throws(new TypeError(), () => new File([], "name", {endings: value}),
                'File constructor should throw');
}, `Invalid "endings" value: ${JSON.stringify(value)}`));

test(t => {
  const test_error = {name: 'test'};
  assert_throws(
    test_error,
    () => new File([], "name", { get endings() { throw test_error; }}),
    'File constructor should propagate exceptions from "endings" property');
}, 'Exception propagation from options');

test(t => {
  let got = false;
  new File([], "name", { get endings() { got = true; } });
  assert_true(got, 'The "endings" property was accessed during construction.');
}, 'The "endings" options property is used');

[
  {name: 'LF', input: '\n', native: native_ending},
  {name: 'CR', input: '\r', native: native_ending},

  {name: 'CRLF', input: '\r\n', native: native_ending},
  {name: 'CRCR', input: '\r\r', native: native_ending.repeat(2)},
  {name: 'LFCR', input: '\n\r', native: native_ending.repeat(2)},
  {name: 'LFLF', input: '\n\n', native: native_ending.repeat(2)},

  {name: 'CRCRLF', input: '\r\r\n', native: native_ending.repeat(2)},
  {name: 'CRLFLF', input: '\r\n\n', native: native_ending.repeat(2)},
  {name: 'CRLFCR', input: '\r\n\r\n', native: native_ending.repeat(2)},

  {name: 'CRLFCRLF', input: '\r\n\r\n', native: native_ending.repeat(2)},
  {name: 'LFCRLFCR', input: '\n\r\n\r', native: native_ending.repeat(3)},

].forEach(testCase => {
  promise_test(async t => {
    const file = new File([testCase.input], "name");
    assert_equals(
      await readBlobAsPromise(file), testCase.input,
      'Newlines should not change with endings unspecified');
  }, `Input ${testCase.name} with endings unspecified`);

  promise_test(async t => {
    const file = new File([testCase.input], "name", {endings: 'transparent'});
    assert_equals(
      await readBlobAsPromise(file), testCase.input,
      'Newlines should not change with endings "transparent"');
  }, `Input ${testCase.name} with endings 'transparent'`);

  promise_test(async t => {
    const file = new File([testCase.input], "name", {endings: 'native'});
    assert_equals(
      await readBlobAsPromise(file), testCase.native,
      'Newlines should match the platform with endings "native"');
  }, `Input ${testCase.name} with endings 'native'`);
});

promise_test(async t => {
  const file = new File(['\r', '\n'], "name", {endings: 'native'});
  const expected = native_ending.repeat(2);
  assert_equals(
    await readBlobAsPromise(file), expected,
    'CR/LF in adjacent strings should be converted to two platform newlines');
}, `CR/LF in adjacent input strings`);

</script>
