Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // 49: Generator - creation
- // To do: make all tests pass, leave the assert lines unchanged!
- // Follow the hints of the failure messages!
- describe('Generators can be created in multiple ways', function() {
- it('the most common way is by adding `*` after `function`', function() {
- function* g() {}
- assertIsGenerator(g());
- });
- it('as a function expression, by adding a `*` after `function`', function() {
- let g = function*() {};
- assertIsGenerator(g());
- });
- it('inside an object by prefixing the function name with `*`', function() {
- let obj = {
- *g() {}
- };
- assertIsGenerator(obj.g());
- });
- it('computed generator names, are just prefixed with a `*`', function() {
- const generatorName = 'g';
- let obj = {
- *[generatorName]() {}
- };
- assertIsGenerator(obj.g());
- });
- it('inside a class the same way', function() {
- const generatorName = 'g';
- class Klazz {
- *[generatorName]() {}
- }
- assertIsGenerator(new Klazz().g());
- });
- function assertIsGenerator(gen) {
- const toStringed = '' + gen;
- assert.equal(toStringed, '[object Generator]');
- }
- });
- // 51: Generator - Yield Expressions
- // To do: make all tests pass, leave the assert lines unchanged!
- // Follow the hints of the failure messages!
- describe('Generator - `yield` is used to pause and resume a generator function', () => {
- function* generatorFunction() {
- yield 'hello';
- yield 'world';
- }
- let generator;
- beforeEach(function() {
- generator = generatorFunction();
- });
- it('converting a generator to an array (using `Array.from`) resumes the generator until all values are received', () => {
- let values = Array.from(generatorFunction());
- assert.deepEqual(values, ['hello', 'world']);
- });
- describe('after the first `generator.next()` call', function() {
- it('the value is "hello"', function() {
- const {value} = generator.next();
- assert.equal(value, 'hello');
- });
- it('and `done` is false', function() {
- const {done} = generator.next();
- assert.equal(done, false);
- });
- });
- describe('after the second `next()` call', function() {
- let secondItem;
- beforeEach(function() {
- generator.next()
- secondItem = generator.next();
- });
- it('`value` is "world"', function() {
- let {value} = secondItem;
- assert.equal(value, 'world');
- });
- it('and `done` is still false', function() {
- const done = secondItem.done;
- assert.equal(done, false);
- });
- });
- describe('after stepping past the last element, calling `next()` that often', function() {
- it('`done` property equals true, since there is nothing more to iterator over', function() {
- generator.next();
- generator.next();
- let {done} = generator.next();
- assert.equal(done, true);
- });
- });
- });
- // 52: Generator - Send value to a generator
- // To do: make all tests pass, leave the assert lines unchanged!
- // Follow the hints of the failure messages!
- describe('Pass a value to a generator', () => {
- it('basics: get the values from a generator in two ways', function() {
- function* generatorFunction() {
- yield 1;
- yield 2;
- }
- // way #1
- var convertedToAnArray = Array.from(generatorFunction());
- // way #2
- var iterator = generatorFunction();
- var iteratedOver = [iterator.next('test').value, iterator.next().value];
- assert.deepEqual(convertedToAnArray, iteratedOver);
- });
- it('pass a value to the iterator', function() {
- function* generatorFunction() {
- yield 1;
- yield 2;
- }
- var iterator = generatorFunction();
- var iteratedOver = [iterator.next().value, iterator.next(2).value];
- assert.deepEqual([1, 2], iteratedOver);
- });
- it('a value passed to the 1st `next()` call is ignored', function() {
- function* generatorFunction() {
- yield 1;
- yield 2
- }
- let iterator = generatorFunction();
- const values = [iterator.next('test').value, iterator.next().value];
- assert.deepEqual(values, [1, 2]);
- });
- });
- // 56: Generator - Send function to a generator
- // To do: make all tests pass, leave the assert lines unchanged!
- // Follow the hints of the failure messages!
- describe('Pass a function to a generator', () => {
- it('the generator can receive a function as a value', function() {
- let fn = function() {};
- function* generatorFunction() {
- yield fn
- assert.equal(yield null, fn); // remember, don't touch this line
- }
- let iterator = generatorFunction();
- iterator.next();
- iterator.next();
- });
- it('pass a function to the iterator, which calls it', function() {
- function* generatorFunction() {
- yield (yield 1)(yield 2);
- }
- var iterator = generatorFunction();
- var iteratedOver = [iterator.next().value, iterator.next().value];
- assert.deepEqual([1, 2], iteratedOver);
- });
- it('nesting yielded function calls', function() {
- function* generatorFunction() {
- yield (yield (yield 1)());
- }
- var iteratedOver = [1, 2, 3];
- assert.deepEqual([1, 2, 3], iteratedOver);
- });
- });
- // 56: Generator - Send function to a generator
- // To do: make all tests pass, leave the assert lines unchanged!
- // Follow the hints of the failure messages!
- describe('Pass a function to a generator', () => {
- it('the generator can receive a function as a value', function() {
- let fn = function() {};
- function* generatorFunction() {
- yield fn
- assert.equal(yield null, fn); // remember, don't touch this line
- }
- let iterator = generatorFunction();
- iterator.next();
- iterator.next();
- });
- it('pass a function to the iterator, which calls it', function() {
- function* generatorFunction() {
- yield (yield 1)(yield 2);
- }
- var iterator = generatorFunction();
- var iteratedOver = [iterator.next().value, iterator.next().value];
- assert.deepEqual([1, 2], iteratedOver);
- });
- it('nesting yielded function calls', function() {
- function* generatorFunction() {
- yield (yield (yield 1)());
- }
- var iteratedOver = [1, 2, 3];
- assert.deepEqual([1, 2, 3], iteratedOver);
- });
- });
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement