matcher icon indicating copy to clipboard operation
matcher copied to clipboard

Difference between yield and yield* in emitsInOrder

Open FujiKinaga opened this issue 1 year ago • 0 comments

When creating a Stream, emitsInOrder seems to works differently for yield and yield*.

The sample code for each is as follows.

  Stream<String> get sampleStream async* {
    print('sampleStream 0');
    yield* Stream.value('sampleStream 0');
    print('sampleStream 1');
    yield* Stream.value('sampleStream 1');
    print('sampleStream 2');
    yield* Stream.value('sampleStream 2');
  }

  Stream<String> get sampleStream2 async* {
    print('sampleStream 0');
    yield 'sampleStream 0';
    print('sampleStream 1');
    yield 'sampleStream 1';
    print('sampleStream 2');
    yield 'sampleStream 2';
  }

Case 1

  expect(
    sampleStream,
    emitsInOrder([
      'sampleStream 0',
    ]),
  );

// sampleStream
sampleStream 0

// sampleStream2
sampleStream 0
sampleStream 1
sampleStream 2

Case 2. Add an expected value in emitsInOrder

  expect(
    sampleStream,
    emitsInOrder([
      'sampleStream 0',
      'sampleStream 1',
    ]),
  );

// sampleStream
sampleStream 0
sampleStream 1

// sampleStream2
sampleStream 0
sampleStream 1
sampleStream 2

Case 3. Add a emitsDone as StreamMatcher

  expect(
    sampleStream,
    emitsInOrder([
      'sampleStream 0',
      emitsDone,
    ]),
  );

// sampleStream
sampleStream 0
sampleStream 1
sampleStream 2

// sampleStream2
sampleStream 0
sampleStream 1
sampleStream 2

In any case, if emitsInOrder is called, all queues should be emitted.

FujiKinaga avatar Dec 23 '23 17:12 FujiKinaga