Add more tests for ListFormat (#2387)

* add tests for ListFormat

address https://github.com/tc39/test262/issues/2386

* add test for formatToParts(undefined)

* test GetIterator throw error

* test formatToParts while GetIterator throws error

* test formatToParts while step_iterator throw

* test format while iteratorStep throw

* fix object name

* test format while IteratorValue throws

* test formatToParts while iteratorValue throws

* test formatToParts while iteratorClose call return

* check format with iteratorClose calls return
This commit is contained in:
Frank Yung-Fong Tang 2019-10-08 11:42:42 -07:00 committed by Leo Balter
parent 2715f312db
commit 8f6369d1c4
10 changed files with 370 additions and 0 deletions

View File

@ -0,0 +1,27 @@
// Copyright 2019 Google Inc. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-Intl.ListFormat.prototype.format
description: Checks the behavior of Abstract Operation StringListFromIterable
called by Intl.ListFormat.prototype.format() while the GetIterator
throws error.
info: |
StringListFromIterable
1. If iterable is undefined, then
a. Return a new empty List.
2. Let iteratorRecord be ? GetIterator(iterable).
features: [Intl.ListFormat]
---*/
function CustomError() {}
let lf = new Intl.ListFormat();
// Test the failure case.
let get_iterator_throw_error = {
[Symbol.iterator]() {
throw new CustomError();
}
};
assert.throws(CustomError,
()=> {lf.format(get_iterator_throw_error)});

View File

@ -0,0 +1,55 @@
// Copyright 2019 Google Inc. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-Intl.ListFormat.prototype.format
description: Checks the behavior of Abstract Operation StringListFromIterable
called by Intl.ListFormat.prototype.format() and check the IteratorClose
calls return.
info: |
StringListFromIterable
1. If iterable is undefined, then
a. Return a new empty List.
2. Let iteratorRecord be ? GetIterator(iterable).
3. Let list be a new empty List.
4. Let next be true.
5. Repeat, while next is not false
a. Set next to ? IteratorStep(iteratorRecord).
b. If next is not false, then
i. Let nextValue be ? IteratorValue(next).
ii. If Type(nextValue) is not String, then
1. Let error be ThrowCompletion(a newly created TypeError object).
2. Return ? IteratorClose(iteratorRecord, error).
iii. Append nextValue to the end of the List list.
6. Return list.
features: [Intl.ListFormat]
---*/
let lf = new Intl.ListFormat();
// Test the failure case.
let iterator_close_call_return = {
[Symbol.iterator]() {
return this;
},
"return"() {
this.returnIsCalled = true;
assert.sameValue(this.count, 3);
},
count: 0,
returnIsCalled: false,
next() {
this.count++;
if (this.count == 3) {
return {done:false, value: 3};
}
if (this.count < 5) {
return {done: false, value: String(this.count)};
}
return {done:true}
}
};
assert.throws(TypeError,
()=> {lf.format(iterator_close_call_return)},
"Iterable yielded 3 which is not a string");
assert.sameValue(iterator_close_call_return.count, 3);
assert.sameValue(iterator_close_call_return.returnIsCalled, true);

View File

@ -0,0 +1,41 @@
// Copyright 2019 Google Inc. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-Intl.ListFormat.prototype.format
description: Checks the behavior of Abstract Operation StringListFromIterable
called by Intl.ListFormat.prototype.format() while iteratorStep throws error.
info: |
StringListFromIterable
1. If iterable is undefined, then
a. Return a new empty List.
2. Let iteratorRecord be ? GetIterator(iterable).
3. Let list be a new empty List.
4. Let next be true.
5. Repeat, while next is not false
a. Set next to ? IteratorStep(iteratorRecord).
features: [Intl.ListFormat]
---*/
function CustomError() {}
let lf = new Intl.ListFormat();
// Test the failure case.
let iterator_step_throw = {
[Symbol.iterator]() {
return this;
},
count: 0,
next() {
this.count++;
if (this.count == 3) {
throw new CustomError();
}
if (this.count < 5) {
return {done: false, value: String(this.count)};
}
return {done:true}
}
};
assert.throws(CustomError,
()=> {lf.format(iterator_step_throw)});
assert.sameValue(iterator_step_throw.count, 3);

View File

@ -0,0 +1,44 @@
// Copyright 2019 Google Inc. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-Intl.ListFormat.prototype.format
description: Checks the behavior of Abstract Operation StringListFromIterable
called by Intl.ListFormat.prototype.format() while iteratorValue throws error.
info: |
StringListFromIterable
1. If iterable is undefined, then
a. Return a new empty List.
2. Let iteratorRecord be ? GetIterator(iterable).
3. Let list be a new empty List.
4. Let next be true.
5. Repeat, while next is not false
a. Set next to ? IteratorStep(iteratorRecord).
b. If next is not false, then
i. Let nextValue be ? IteratorValue(next).
features: [Intl.ListFormat]
---*/
function CustomError() {}
let lf = new Intl.ListFormat();
// Test the failure case.
let iterator_value_throw = {
[Symbol.iterator]() {
return this;
},
count: 0,
next() {
this.count++;
if (this.count == 3) {
return {done: false, get value() { throw new CustomError() }};
}
if (this.count < 5) {
return {done: false, value: String(this.count)};
}
return {done:true}
}
};
assert.throws(CustomError,
()=> {lf.format(iterator_value_throw)});
assert.sameValue(iterator_value_throw.count, 3);

View File

@ -0,0 +1,17 @@
// Copyright 2019 Google Inc. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-Intl.ListFormat.prototype.format
description: Checks the behavior of Abstract Operation StringListFromIterable
called by Intl.ListFormat.prototype.format(undefined).
info: |
StringListFromIterable
1. If iterable is undefined, then
a. Return a new empty List.
features: [Intl.ListFormat]
---*/
let lf = new Intl.ListFormat();
assert.sameValue("", lf.format(undefined));

View File

@ -0,0 +1,27 @@
// Copyright 2019 Google Inc. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-Intl.ListFormat.prototype.format
description: Checks the behavior of Abstract Operation StringListFromIterable
called by Intl.ListFormat.prototype.formatToParts() while the GetIterator
throws error.
info: |
StringListFromIterable
1. If iterable is undefined, then
a. Return a new empty List.
2. Let iteratorRecord be ? GetIterator(iterable).
features: [Intl.ListFormat]
---*/
function CustomError() {}
let lf = new Intl.ListFormat();
// Test the failure case.
let get_iterator_throw_error = {
[Symbol.iterator]() {
throw new CustomError();
}
};
assert.throws(CustomError,
()=> {lf.formatToParts(get_iterator_throw_error)});

View File

@ -0,0 +1,55 @@
// Copyright 2019 Google Inc. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-Intl.ListFormat.prototype.format
description: Checks the behavior of Abstract Operation StringListFromIterable
called by Intl.ListFormat.prototype.formatToParts() and check the IteratorClose
calls return.
info: |
StringListFromIterable
1. If iterable is undefined, then
a. Return a new empty List.
2. Let iteratorRecord be ? GetIterator(iterable).
3. Let list be a new empty List.
4. Let next be true.
5. Repeat, while next is not false
a. Set next to ? IteratorStep(iteratorRecord).
b. If next is not false, then
i. Let nextValue be ? IteratorValue(next).
ii. If Type(nextValue) is not String, then
1. Let error be ThrowCompletion(a newly created TypeError object).
2. Return ? IteratorClose(iteratorRecord, error).
iii. Append nextValue to the end of the List list.
6. Return list.
features: [Intl.ListFormat]
---*/
let lf = new Intl.ListFormat();
// Test the failure case.
let iterator_close_call_return = {
[Symbol.iterator]() {
return this;
},
"return"() {
this.returnIsCalled = true;
assert.sameValue(this.count, 3);
},
count: 0,
returnIsCalled: false,
next() {
this.count++;
if (this.count == 3) {
return {done:false, value: 3};
}
if (this.count < 5) {
return {done: false, value: String(this.count)};
}
return {done:true}
}
};
assert.throws(TypeError,
()=> {lf.formatToParts(iterator_close_call_return)},
"Iterable yielded 3 which is not a string");
assert.sameValue(iterator_close_call_return.count, 3);
assert.sameValue(iterator_close_call_return.returnIsCalled, true);

View File

@ -0,0 +1,42 @@
// Copyright 2019 Google Inc. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-Intl.ListFormat.prototype.format
description: Checks the behavior of Abstract Operation StringListFromIterable
called by Intl.ListFormat.prototype.formatToParts() while iteratorStep throws error.
info: |
StringListFromIterable
1. If iterable is undefined, then
a. Return a new empty List.
2. Let iteratorRecord be ? GetIterator(iterable).
3. Let list be a new empty List.
4. Let next be true.
5. Repeat, while next is not false
a. Set next to ? IteratorStep(iteratorRecord).
features: [Intl.ListFormat]
---*/
function CustomError() {}
let lf = new Intl.ListFormat();
// Test the failure case.
let iterator_step_throw = {
[Symbol.iterator]() {
return this;
},
count: 0,
next() {
this.count++;
if (this.count == 3) {
throw new CustomError();
}
if (this.count < 5) {
return {done: false, value: String(this.count)};
}
return {done:true}
}
};
assert.throws(CustomError,
()=> {lf.formatToParts(iterator_step_throw)});
assert.sameValue(iterator_step_throw.count, 3);

View File

@ -0,0 +1,44 @@
// Copyright 2019 Google Inc. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-Intl.ListFormat.prototype.format
description: Checks the behavior of Abstract Operation StringListFromIterable
called by Intl.ListFormat.prototype.formatToParts() while iteratorValue throws error.
info: |
StringListFromIterable
1. If iterable is undefined, then
a. Return a new empty List.
2. Let iteratorRecord be ? GetIterator(iterable).
3. Let list be a new empty List.
4. Let next be true.
5. Repeat, while next is not false
a. Set next to ? IteratorStep(iteratorRecord).
b. If next is not false, then
i. Let nextValue be ? IteratorValue(next).
features: [Intl.ListFormat]
---*/
function CustomError() {}
let lf = new Intl.ListFormat();
// Test the failure case.
let iterator_value_throw = {
[Symbol.iterator]() {
return this;
},
count: 0,
next() {
this.count++;
if (this.count == 3) {
return {done: false, get value() { throw new CustomError() }};
}
if (this.count < 5) {
return {done: false, value: String(this.count)};
}
return {done:true}
}
};
assert.throws(CustomError,
()=> {lf.formatToParts(iterator_value_throw)});
assert.sameValue(iterator_value_throw.count, 3);

View File

@ -0,0 +1,18 @@
// Copyright 2019 Google Inc. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-Intl.ListFormat.prototype.format
description: Checks the behavior of Abstract Operation StringListFromIterable
called by Intl.ListFormat.prototype.formatToParts(undefined).
info: |
StringListFromIterable
1. If iterable is undefined, then
a. Return a new empty List.
features: [Intl.ListFormat]
includes: [compareArray.js]
---*/
let lf = new Intl.ListFormat();
assert(compareArray([], lf.formatToParts(undefined)));