mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 22:02:44 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			125 lines
		
	
	
	
		
			3.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			125 lines
		
	
	
	
		
			3.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| describe("errors", () => {
 | |
|     test("called with non-Object", () => {
 | |
|         expect(() => {
 | |
|             Iterator.from(Symbol.hasInstance);
 | |
|         }).toThrowWithMessage(TypeError, "Symbol(Symbol.hasInstance) is not an object");
 | |
|     });
 | |
| 
 | |
|     test("@@iterator is not callable", () => {
 | |
|         const iterable = {};
 | |
|         iterable[Symbol.iterator] = 12389;
 | |
| 
 | |
|         expect(() => {
 | |
|             Iterator.from(iterable);
 | |
|         }).toThrowWithMessage(TypeError, "12389 is not a function");
 | |
|     });
 | |
| 
 | |
|     test("@@iterator throws an exception", () => {
 | |
|         function TestError() {}
 | |
| 
 | |
|         const iterable = {};
 | |
|         iterable[Symbol.iterator] = () => {
 | |
|             throw new TestError();
 | |
|         };
 | |
| 
 | |
|         expect(() => {
 | |
|             Iterator.from(iterable);
 | |
|         }).toThrow(TestError);
 | |
|     });
 | |
| 
 | |
|     test("@@iterator return a non-Object", () => {
 | |
|         const iterable = {};
 | |
|         iterable[Symbol.iterator] = () => {
 | |
|             return Symbol.hasInstance;
 | |
|         };
 | |
| 
 | |
|         expect(() => {
 | |
|             Iterator.from(iterable);
 | |
|         }).toThrowWithMessage(TypeError, "Symbol(Symbol.hasInstance) is not an object");
 | |
|     });
 | |
| });
 | |
| 
 | |
| describe("normal behavior", () => {
 | |
|     test("length is 1", () => {
 | |
|         expect(Iterator.from).toHaveLength(1);
 | |
|     });
 | |
| 
 | |
|     test("create Iterator from a string", () => {
 | |
|         const iterator = Iterator.from("ab");
 | |
| 
 | |
|         let result = iterator.next();
 | |
|         expect(result.value).toBe("a");
 | |
|         expect(result.done).toBeFalse();
 | |
| 
 | |
|         result = iterator.next();
 | |
|         expect(result.value).toBe("b");
 | |
|         expect(result.done).toBeFalse();
 | |
| 
 | |
|         result = iterator.next();
 | |
|         expect(result.value).toBeUndefined();
 | |
|         expect(result.done).toBeTrue();
 | |
|     });
 | |
| 
 | |
|     test("does not coerce strings to objects", () => {
 | |
|         const stringIterator = String.prototype[Symbol.iterator];
 | |
|         let observedType = null;
 | |
| 
 | |
|         Object.defineProperty(String.prototype, Symbol.iterator, {
 | |
|             get() {
 | |
|                 "use strict";
 | |
|                 observedType = typeof this;
 | |
|                 return stringIterator;
 | |
|             },
 | |
|         });
 | |
| 
 | |
|         Iterator.from("ab");
 | |
|         expect(observedType).toBe("string");
 | |
|     });
 | |
| 
 | |
|     test("create Iterator from generator", () => {
 | |
|         function* generator() {
 | |
|             yield 1;
 | |
|             yield 2;
 | |
|         }
 | |
| 
 | |
|         const iterator = Iterator.from(generator());
 | |
| 
 | |
|         let result = iterator.next();
 | |
|         expect(result.value).toBe(1);
 | |
|         expect(result.done).toBeFalse();
 | |
| 
 | |
|         result = iterator.next();
 | |
|         expect(result.value).toBe(2);
 | |
|         expect(result.done).toBeFalse();
 | |
| 
 | |
|         result = iterator.next();
 | |
|         expect(result.value).toBeUndefined();
 | |
|         expect(result.done).toBeTrue();
 | |
|     });
 | |
| 
 | |
|     test("create Iterator from iterator-like object", () => {
 | |
|         class TestIterator {
 | |
|             next() {
 | |
|                 if (this.#first) {
 | |
|                     this.#first = false;
 | |
|                     return { value: 1, done: false };
 | |
|                 }
 | |
| 
 | |
|                 return { value: undefined, done: true };
 | |
|             }
 | |
| 
 | |
|             #first = true;
 | |
|         }
 | |
| 
 | |
|         const testIterator = new TestIterator();
 | |
|         const iterator = Iterator.from(testIterator);
 | |
| 
 | |
|         let result = iterator.next();
 | |
|         expect(result.value).toBe(1);
 | |
|         expect(result.done).toBeFalse();
 | |
| 
 | |
|         result = iterator.next();
 | |
|         expect(result.value).toBeUndefined();
 | |
|         expect(result.done).toBeTrue();
 | |
|     });
 | |
| });
 | 
