Re: [whatwg/streams] Port some TransformStream tests to wpt (#531)

domenic requested changes on this pull request.

Not sure if you rebased this and I missed it, or you just happened to port only tests that are already compatible with the new setup, or what, but in actuality there's no conflict here :). Left some review comments, and happy to take these conversions once we get them tidied up!

> @@ -0,0 +1,12 @@
+<!DOCTYPE html>

Let's merge the constructor tests into the general tests

> @@ -0,0 +1,15 @@
+'use strict';
+
+if (self.importScripts) {
+  self.importScripts('/resources/testharness.js');
+}
+
+test(() => {
+  const ts = new TransformStream({ transform() { } });
+}, 'TransformStream can be constructed with a transform function');
+
+test(() => {
+  const error = new TypeError('something bad');
+  assert_throws(error, () => new TransformStream(), 'TransformStream cannot be constructed with no arguments');

Nit: Use `assert_throws(new TypeError(), ...)` here instead of constructing an error with an arbitrary string.

> +
+  return ts.writable.getWriter().close().then(() => {
+    return assert_true(flushCalled, 'closing the writable triggers the transform flush immediately');
+  });
+}, 'TransformStream flush is called immediately when the writable is closed, if no writes are queued');
+
+// TODO
+test(() => {
+  let flushCalled = false;
+  const ts = new TransformStream({
+    transform() {
+      return new Promise(resolve => setTimeout(resolve, 10));
+    },
+    flush() {
+      flushCalled = true;
+      return new Promise(); // never resolves

This is not valid promise usage; it should be `new Promise(() => {})`. A preexisting problem I guess!

> +    }
+  });
+
+  const writer = ts.writable.getWriter();
+  writer.write('a');
+  writer.close();
+  assert_false(flushCalled, 'closing the writable does not immediately call flush if writes are not finished');
+
+  let rsClosed = false;
+  ts.readable.getReader().closed.then(() => {
+    rsClosed = true;
+  });
+
+  setTimeout(() => {
+    assert_true(flushCalled, 'flush is eventually called');
+    assert_equals(rsClosed, false, 'if flushPromise does not resolve, the readable does not become closed');

You can use `assert_false` here.

> +      c = controller;
+    },
+    transform() {
+    },
+    flush() {
+      c.enqueue('x');
+      c.enqueue('y');
+    }
+  });
+
+  const reader = ts.readable.getReader();
+
+  const writer = ts.writable.getWriter();
+  writer.write('a');
+  writer.close();
+  reader.read().then(result1 => {

return the promise here, and remove the `.catch(e => t.error(e))` (`t` is not defined)

> +      flushCalled = true;
+      return new Promise(); // never resolves
+    }
+  });
+
+  const writer = ts.writable.getWriter();
+  writer.write('a');
+  writer.close();
+  assert_false(flushCalled, 'closing the writable does not immediately call flush if writes are not finished');
+
+  let rsClosed = false;
+  ts.readable.getReader().closed.then(() => {
+    rsClosed = true;
+  });
+
+  setTimeout(() => {

Instead of using setTimeout, do `return delay(50).then(...)`. This will require importing test-utils for these tests, in both the HTML and JS files. See other tests for examples.

> +    transform() {
+    },
+    flush() {
+      c.enqueue('x');
+      c.enqueue('y');
+      return new Promise(resolve => setTimeout(resolve, 10));
+    }
+  });
+
+  const reader = ts.readable.getReader();
+
+  const writer = ts.writable.getWriter();
+  writer.write('a');
+  writer.close();
+
+  reader.read().then(result1 => {

Do `return Promise.all([...])` here on the two promises, with no `.catch()`s.

> +  })
+  .catch(e => t.error(e));
+}, 'TransformStream flush gets a chance to enqueue more into the readable');
+
+promise_test(() => {
+  let c;
+  const ts = new TransformStream({
+    start(controller) {
+      c = controller;
+    },
+    transform() {
+    },
+    flush() {
+      c.enqueue('x');
+      c.enqueue('y');
+      return new Promise(resolve => setTimeout(resolve, 10));

Once you've imported `delay()`, you can do `return delay(10)` here.

> +  reader.read().then(result1 => {
+    assert_equals(result1.value, 'x', 'the first chunk read is the first one enqueued in flush');
+    assert_equals(result1.done, false, 'the first chunk read is the first one enqueued in flush');
+
+    return reader.read().then(result2 => {
+      assert_equals(result2.value, 'y', 'the second chunk read is the second one enqueued in flush');
+      assert_equals(result2.done, false, 'the second chunk read is the second one enqueued in flush');
+    });
+  })
+  .catch(e => t.error(e));
+
+  reader.closed.then(() => {
+    assert_true(true, 'readable reader becomes closed');
+  })
+  .catch(e => { throw e; });
+}, 'TransformStream flush gets a chance to enqueue more into the readable, and can then async close');

Newline at EOF

> @@ -0,0 +1,22 @@
+'use strict';
+
+if (self.importScripts) {
+  self.importScripts('/resources/testharness.js');
+}
+
+test(() => {
+  const ts = new TransformStream({ transform() { } });
+
+  assert_true(Object.getOwnPropertyDescriptor(Object.getPrototypeOf(ts), 'writeable'), 'it has a writable property');

This existing test of the property descriptor is kind of bad. Maybe replace it with something like https://github.com/w3c/web-platform-tests/blob/a838bae2db982f96ddb6760ca88e699d4514884e/streams/readable-streams/general.js#L56-L61 instead.

> +test(() => {
+  const ts = new TransformStream({ transform() { } });
+
+  assert_true(Object.getOwnPropertyDescriptor(Object.getPrototypeOf(ts), 'writeable'), 'it has a writable property');
+  assert_true(ts.writable instanceof WritableStream, 'writable is an instance of WritableStream');
+
+  assert_true(Object.getOwnPropertyDescriptor(Object.getPrototypeOf(ts), 'readable'), 'it has a readable property');
+  assert_true(ts.readable instanceof ReadableStream, 'readable is an instance of ReadableStream');
+}, 'TransformStream instances must have writable and readable properties of the correct types');
+
+test(() => {
+  const ts = new TransformStream({ transform() { } });
+
+  const writer = ts.writable.getWriter();
+  assert_equals(writer.desiredSize, 1, 'writer.desiredSize should be 1');
+}, 'TransformStream writable starts in the writable state');

Newline at EOF

-- 
You are receiving this because you are subscribed to this thread.
Reply to this email directly or view it on GitHub:
https://github.com/whatwg/streams/pull/531#pullrequestreview-4157459

Received on Thursday, 13 October 2016 20:36:51 UTC