diff --git a/test/built-ins/Temporal/PlainTime/compare/argument-cast.js b/test/built-ins/Temporal/PlainTime/compare/argument-cast.js
new file mode 100644
index 0000000000..60ff3d6f8c
--- /dev/null
+++ b/test/built-ins/Temporal/PlainTime/compare/argument-cast.js
@@ -0,0 +1,19 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaintime.compare
+description: compare() casts its arguments
+features: [Temporal]
+---*/
+
+const t1 = Temporal.PlainTime.from("08:44:15.321");
+const t2 = Temporal.PlainTime.from("14:23:30.123");
+
+assert.sameValue(Temporal.PlainTime.compare({ hour: 16, minute: 34 }, t2), 1, "one object");
+assert.sameValue(Temporal.PlainTime.compare("16:34", t2), 1, "one string");
+assert.throws(TypeError, () => Temporal.PlainTime.compare({ hours: 16 }, t2), "one missing property");
+
+assert.sameValue(Temporal.PlainTime.compare(t1, { hour: 16, minute: 34 }), -1, "two object");
+assert.sameValue(Temporal.PlainTime.compare(t1, "16:34"), -1, "two string");
+assert.throws(TypeError, () => Temporal.PlainTime.compare(t1, { hours: 16 }), "two missing property");
diff --git a/test/built-ins/Temporal/PlainTime/compare/basic.js b/test/built-ins/Temporal/PlainTime/compare/basic.js
new file mode 100644
index 0000000000..f13061faeb
--- /dev/null
+++ b/test/built-ins/Temporal/PlainTime/compare/basic.js
@@ -0,0 +1,17 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaintime.compare
+description: Basic tests for compare()
+features: [Temporal]
+---*/
+
+const t1 = Temporal.PlainTime.from("08:44:15.321");
+const t1bis = Temporal.PlainTime.from("08:44:15.321");
+const t2 = Temporal.PlainTime.from("14:23:30.123");
+
+assert.sameValue(Temporal.PlainTime.compare(t1, t1), 0, "same object");
+assert.sameValue(Temporal.PlainTime.compare(t1, t1bis), 0, "different object");
+assert.sameValue(Temporal.PlainTime.compare(t1, t2), -1, "before");
+assert.sameValue(Temporal.PlainTime.compare(t2, t1), 1, "after");
diff --git a/test/built-ins/Temporal/PlainTime/from/argument-plaindatetime.js b/test/built-ins/Temporal/PlainTime/from/argument-plaindatetime.js
new file mode 100644
index 0000000000..4fd82141c2
--- /dev/null
+++ b/test/built-ins/Temporal/PlainTime/from/argument-plaindatetime.js
@@ -0,0 +1,14 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaintime.from
+description: Fast path for converting Temporal.PlainDateTime to Temporal.PlainDate by reading internal slots
+includes: [compareArray.js, temporalHelpers.js]
+features: [Temporal]
+---*/
+
+TemporalHelpers.checkPlainDateTimeConversionFastPath((plainDateTime) => {
+  const result = Temporal.PlainTime.from(plainDateTime);
+  TemporalHelpers.assertPlainTime(result, 12, 34, 56, 987, 654, 321);
+});
diff --git a/test/built-ins/Temporal/PlainTime/from/argument-plaintime.js b/test/built-ins/Temporal/PlainTime/from/argument-plaintime.js
new file mode 100644
index 0000000000..2c6af716f3
--- /dev/null
+++ b/test/built-ins/Temporal/PlainTime/from/argument-plaintime.js
@@ -0,0 +1,14 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaintime.from
+description: A PlainTime object is copied, not returned directly
+includes: [compareArray.js, temporalHelpers.js]
+features: [Temporal]
+---*/
+
+const plainTime = Temporal.PlainTime.from("11:42:00");
+const result = Temporal.PlainTime.from(plainTime);
+assert.notSameValue(result, plainTime);
+TemporalHelpers.assertPlainTime(result, 11, 42, 0, 0, 0, 0);
diff --git a/test/built-ins/Temporal/PlainTime/from/argument-string-invalid.js b/test/built-ins/Temporal/PlainTime/from/argument-string-invalid.js
new file mode 100644
index 0000000000..5f6d1ce1e1
--- /dev/null
+++ b/test/built-ins/Temporal/PlainTime/from/argument-string-invalid.js
@@ -0,0 +1,26 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaintime.from
+description: overflow property is extracted with ISO-invalid string argument.
+includes: [compareArray.js, temporalHelpers.js]
+features: [Temporal]
+---*/
+
+const expected = [
+  "get overflow",
+  "get overflow.toString",
+  "call overflow.toString",
+];
+
+let actual = [];
+const object = {
+  get overflow() {
+    actual.push("get overflow");
+    return TemporalHelpers.toPrimitiveObserver(actual, "constrain", "overflow");
+  }
+};
+
+assert.throws(RangeError, () => Temporal.PlainTime.from("24:60", object));
+assert.compareArray(actual, expected);
diff --git a/test/built-ins/Temporal/PlainTime/from/argument-string-trailing-junk.js b/test/built-ins/Temporal/PlainTime/from/argument-string-trailing-junk.js
new file mode 100644
index 0000000000..8ec90b51c2
--- /dev/null
+++ b/test/built-ins/Temporal/PlainTime/from/argument-string-trailing-junk.js
@@ -0,0 +1,11 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaintime.from
+description: RangeError thrown if a string argument has trailing junk
+features: [Temporal, arrow-function]
+---*/
+
+const arg = "15:23:30.100junk";
+assert.throws(RangeError, () => Temporal.PlainTime.from(arg));
diff --git a/test/built-ins/Temporal/PlainTime/from/argument-string.js b/test/built-ins/Temporal/PlainTime/from/argument-string.js
new file mode 100644
index 0000000000..a8225d48b0
--- /dev/null
+++ b/test/built-ins/Temporal/PlainTime/from/argument-string.js
@@ -0,0 +1,57 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaintime.from
+description: Various ISO strings supported
+includes: [compareArray.js, temporalHelpers.js]
+features: [Temporal]
+---*/
+
+const tests = [
+  ["15:23", 15, 23, 0, 0, 0, 0],
+  ["15:23:30", 15, 23, 30, 0, 0, 0],
+  ["15:23:30.123", 15, 23, 30, 123, 0, 0],
+  ["15:23:30.123456", 15, 23, 30, 123, 456, 0],
+  ["15:23:30.123456789", 15, 23, 30, 123, 456, 789],
+  ["1976-11-18T15:23:30.1", 15, 23, 30, 100, 0, 0],
+  ["1976-11-18T15:23:30.12", 15, 23, 30, 120, 0, 0],
+  ["1976-11-18T15:23:30.123", 15, 23, 30, 123, 0, 0],
+  ["1976-11-18T15:23:30.1234", 15, 23, 30, 123, 400, 0],
+  ["1976-11-18T15:23:30.12345", 15, 23, 30, 123, 450, 0],
+  ["1976-11-18T15:23:30.123456", 15, 23, 30, 123, 456, 0],
+  ["1976-11-18T15:23:30.1234567", 15, 23, 30, 123, 456, 700],
+  ["1976-11-18T15:23:30.12345678", 15, 23, 30, 123, 456, 780],
+  ["1976-11-18T15:23:30.123456789", 15, 23, 30, 123, 456, 789],
+  ["1976-11-18T15:23:30,12", 15, 23, 30, 120, 0, 0],
+  ["1976-11-18T15:23:30.12\u221202:00", 15, 23, 30, 120, 0, 0],
+  ["152330", 15, 23, 30, 0, 0, 0],
+  ["152330.1", 15, 23, 30, 100, 0, 0],
+  ["152330-08", 15, 23, 30, 0, 0, 0],
+  ["152330.1-08", 15, 23, 30, 100, 0, 0],
+  ["152330-0800", 15, 23, 30, 0, 0, 0],
+  ["152330.1-0800", 15, 23, 30, 100, 0, 0],
+  ["1976-11-18T152330.1+00:00", 15, 23, 30, 100, 0, 0],
+  ["19761118T15:23:30.1+00:00", 15, 23, 30, 100, 0, 0],
+  ["1976-11-18T15:23:30.1+0000", 15, 23, 30, 100, 0, 0],
+  ["1976-11-18T152330.1+0000", 15, 23, 30, 100, 0, 0],
+  ["19761118T15:23:30.1+0000", 15, 23, 30, 100, 0, 0],
+  ["19761118T152330.1+00:00", 15, 23, 30, 100, 0, 0],
+  ["19761118T152330.1+0000", 15, 23, 30, 100, 0, 0],
+  ["+001976-11-18T152330.1+00:00", 15, 23, 30, 100, 0, 0],
+  ["+0019761118T15:23:30.1+00:00", 15, 23, 30, 100, 0, 0],
+  ["+001976-11-18T15:23:30.1+0000", 15, 23, 30, 100, 0, 0],
+  ["+001976-11-18T152330.1+0000", 15, 23, 30, 100, 0, 0],
+  ["+0019761118T15:23:30.1+0000", 15, 23, 30, 100, 0, 0],
+  ["+0019761118T152330.1+00:00", 15, 23, 30, 100, 0, 0],
+  ["+0019761118T152330.1+0000", 15, 23, 30, 100, 0, 0],
+  ["15", 15, 0, 0, 0, 0, 0],
+  ["T15:23:30", 15, 23, 30, 0, 0, 0],
+  ["t152330", 15, 23, 30, 0, 0, 0],
+];
+
+for (const [input, ...expected] of tests) {
+  const result = Temporal.PlainTime.from(input);
+  assert.sameValue(expected.length, 6, input);
+  TemporalHelpers.assertPlainTime(result, ...expected, input);
+}
diff --git a/test/built-ins/Temporal/PlainTime/from/options-invalid.js b/test/built-ins/Temporal/PlainTime/from/options-invalid.js
new file mode 100644
index 0000000000..f292be612d
--- /dev/null
+++ b/test/built-ins/Temporal/PlainTime/from/options-invalid.js
@@ -0,0 +1,14 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaintime.from
+description: TypeError thrown when a primitive is passed as the options argument
+features: [Temporal]
+---*/
+
+const values = [null, true, "hello", Symbol("foo"), 1, 1n];
+
+for (const badOptions of values) {
+  assert.throws(TypeError, () => Temporal.PlainTime.from({ hours: 12 }, badOptions));
+}
diff --git a/test/built-ins/Temporal/PlainTime/from/overflow-invalid-string.js b/test/built-ins/Temporal/PlainTime/from/overflow-invalid-string.js
index 7d974dd5e9..856d071453 100644
--- a/test/built-ins/Temporal/PlainTime/from/overflow-invalid-string.js
+++ b/test/built-ins/Temporal/PlainTime/from/overflow-invalid-string.js
@@ -20,5 +20,7 @@ const validValues = [
   "12:00",
 ];
 validValues.forEach((value) => {
-  assert.throws(RangeError, () => Temporal.PlainTime.from(value, { overflow: "other string" }));
+  ["", "CONSTRAIN", "balance", "other string", "constra\u0131n"].forEach((overflow) => {
+    assert.throws(RangeError, () => Temporal.PlainTime.from(value, { overflow }));
+  });
 });
diff --git a/test/built-ins/Temporal/PlainTime/from/overflow-undefined.js b/test/built-ins/Temporal/PlainTime/from/overflow-undefined.js
index 76f2e7d824..74ef13df00 100644
--- a/test/built-ins/Temporal/PlainTime/from/overflow-undefined.js
+++ b/test/built-ins/Temporal/PlainTime/from/overflow-undefined.js
@@ -24,6 +24,8 @@ validValues.forEach((value) => {
   TemporalHelpers.assertPlainTime(explicit, 12, 0, 0, 0, 0, 0, "overflow is ignored");
   const implicit = Temporal.PlainTime.from(value, {});
   TemporalHelpers.assertPlainTime(implicit, 12, 0, 0, 0, 0, 0, "overflow is ignored");
+  const lambda = Temporal.PlainTime.from(value, () => {});
+  TemporalHelpers.assertPlainTime(lambda, 12, 0, 0, 0, 0, 0, "overflow is ignored");
 });
 
 const propertyBag = { hour: 26 };
@@ -31,3 +33,5 @@ const explicit = Temporal.PlainTime.from(propertyBag, { overflow: undefined });
 TemporalHelpers.assertPlainTime(explicit, 23, 0, 0, 0, 0, 0, "default overflow is constrain");
 const implicit = Temporal.PlainTime.from(propertyBag, {});
 TemporalHelpers.assertPlainTime(implicit, 23, 0, 0, 0, 0, 0, "default overflow is constrain");
+const lambda = Temporal.PlainTime.from(propertyBag, () => {});
+TemporalHelpers.assertPlainTime(lambda, 23, 0, 0, 0, 0, 0, "default overflow is constrain");
diff --git a/test/built-ins/Temporal/PlainTime/prototype/add/argument-object-invalid.js b/test/built-ins/Temporal/PlainTime/prototype/add/argument-object-invalid.js
new file mode 100644
index 0000000000..553e04fbcd
--- /dev/null
+++ b/test/built-ins/Temporal/PlainTime/prototype/add/argument-object-invalid.js
@@ -0,0 +1,13 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaintime.prototype.add
+description: Mixed positive and negative values or missing properties always throw
+features: [Temporal]
+---*/
+
+const plainTime = new Temporal.PlainTime(12, 34, 56, 123, 987, 500);
+assert.throws(RangeError, () => plainTime.add({ hours: 1, minutes: -6 }), "mixed signs");
+assert.throws(TypeError, () => plainTime.add({}), "no properties");
+assert.throws(TypeError, () => plainTime.add({ hour: 12 }), "only singular 'hour' property");
diff --git a/test/built-ins/Temporal/PlainTime/prototype/add/options-ignored.js b/test/built-ins/Temporal/PlainTime/prototype/add/options-ignored.js
new file mode 100644
index 0000000000..b5affb9c81
--- /dev/null
+++ b/test/built-ins/Temporal/PlainTime/prototype/add/options-ignored.js
@@ -0,0 +1,29 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaintime.prototype.add
+description: Options argument is ignored.
+includes: [temporalHelpers.js]
+features: [Symbol, Temporal]
+---*/
+
+const values = [
+  undefined,
+  null,
+  true,
+  "hello",
+  Symbol("foo"),
+  1,
+  1n,
+  {},
+  () => {},
+  { get overflow() { throw new Test262Error("should not get overflow") } },
+];
+
+const time = Temporal.PlainTime.from("15:23:30.123456789");
+for (const options of values) {
+  TemporalHelpers.assertPlainTime(time.add({ hours: 1 }, options),
+    16, 23, 30, 123, 456, 789);
+}
+
diff --git a/test/built-ins/Temporal/PlainTime/prototype/equals/argument-cast.js b/test/built-ins/Temporal/PlainTime/prototype/equals/argument-cast.js
new file mode 100644
index 0000000000..5da0961604
--- /dev/null
+++ b/test/built-ins/Temporal/PlainTime/prototype/equals/argument-cast.js
@@ -0,0 +1,17 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaintime.prototype.equals
+description: equals() casts its argument
+features: [Temporal]
+---*/
+
+const t1 = Temporal.PlainTime.from("08:44:15.321");
+
+assert.sameValue(t1.equals({ hour: 14, minute: 23, second: 30, millisecond: 123 }), false, "object");
+assert.sameValue(t1.equals({ hour: 8, minute: 44, second: 15, millisecond: 321 }), true, "object");
+assert.sameValue(t1.equals("14:23:30.123"), false, "string");
+assert.sameValue(t1.equals("08:44:15.321"), true, "string");
+assert.throws(TypeError, () => t1.equals({}), "no properties");
+assert.throws(TypeError, () => t1.equals({ hours: 8 }), "only plural property");
diff --git a/test/built-ins/Temporal/PlainTime/prototype/equals/basic.js b/test/built-ins/Temporal/PlainTime/prototype/equals/basic.js
new file mode 100644
index 0000000000..3f4478a81e
--- /dev/null
+++ b/test/built-ins/Temporal/PlainTime/prototype/equals/basic.js
@@ -0,0 +1,15 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaintime.prototype.equals
+description: Basic tests for equals()
+features: [Temporal]
+---*/
+
+const t1 = Temporal.PlainTime.from("08:44:15.321");
+const t1bis = Temporal.PlainTime.from("08:44:15.321");
+const t2 = Temporal.PlainTime.from("14:23:30.123");
+assert.sameValue(t1.equals(t1), true, "same object");
+assert.sameValue(t1.equals(t1bis), true, "different object");
+assert.sameValue(t1.equals(t2), false, "different times");
diff --git a/test/built-ins/Temporal/PlainTime/prototype/round/roundingmode-invalid-string.js b/test/built-ins/Temporal/PlainTime/prototype/round/roundingmode-invalid-string.js
index 8048aab5b5..200c100d2e 100644
--- a/test/built-ins/Temporal/PlainTime/prototype/round/roundingmode-invalid-string.js
+++ b/test/built-ins/Temporal/PlainTime/prototype/round/roundingmode-invalid-string.js
@@ -8,4 +8,6 @@ features: [Temporal]
 ---*/
 
 const time = new Temporal.PlainTime(12, 34, 56, 123, 987, 500);
-assert.throws(RangeError, () => time.round({ smallestUnit: "microsecond", roundingMode: "other string" }));
+for (const roundingMode of ["other string", "cile", "CEIL", "ce\u0131l"]) {
+  assert.throws(RangeError, () => time.round({ smallestUnit: "microsecond", roundingMode }));
+}
diff --git a/test/built-ins/Temporal/PlainTime/prototype/since/options-invalid.js b/test/built-ins/Temporal/PlainTime/prototype/since/options-invalid.js
new file mode 100644
index 0000000000..96a88edee0
--- /dev/null
+++ b/test/built-ins/Temporal/PlainTime/prototype/since/options-invalid.js
@@ -0,0 +1,16 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaintime.prototype.since
+description: TypeError thrown when a primitive is passed as the options argument
+features: [Temporal]
+---*/
+
+const values = [null, true, "hello", Symbol("foo"), 1, 1n];
+const time = new Temporal.PlainTime(15, 23, 30, 123, 456, 789);
+const one = new Temporal.PlainTime(16, 23, 30, 123, 456, 789);
+
+for (const badOptions of values) {
+  assert.throws(TypeError, () => time.since(one, badOptions));
+}
diff --git a/test/built-ins/Temporal/PlainTime/prototype/since/roundingmode-invalid-string.js b/test/built-ins/Temporal/PlainTime/prototype/since/roundingmode-invalid-string.js
index 9778f33342..392c8565be 100644
--- a/test/built-ins/Temporal/PlainTime/prototype/since/roundingmode-invalid-string.js
+++ b/test/built-ins/Temporal/PlainTime/prototype/since/roundingmode-invalid-string.js
@@ -9,4 +9,7 @@ features: [Temporal]
 
 const earlier = new Temporal.PlainTime(12, 34, 56, 0, 0, 0);
 const later = new Temporal.PlainTime(13, 35, 57, 123, 987, 500);
-assert.throws(RangeError, () => later.since(earlier, { smallestUnit: "microsecond", roundingMode: "other string" }));
+
+for (const roundingMode of ["other string", "cile", "CEIL", "ce\u0131l"]) {
+  assert.throws(RangeError, () => later.since(earlier, { smallestUnit: "microsecond", roundingMode }));
+}
diff --git a/test/built-ins/Temporal/PlainTime/prototype/since/smallestunit-undefined.js b/test/built-ins/Temporal/PlainTime/prototype/since/smallestunit-undefined.js
index c28576d54c..a060ca25bb 100644
--- a/test/built-ins/Temporal/PlainTime/prototype/since/smallestunit-undefined.js
+++ b/test/built-ins/Temporal/PlainTime/prototype/since/smallestunit-undefined.js
@@ -15,3 +15,5 @@ const explicit = later.since(earlier, { smallestUnit: undefined });
 TemporalHelpers.assertDuration(explicit, 0, 0, 0, 0, 1, 1, 1, 987, 654, 321, "default smallestUnit is nanosecond");
 const implicit = later.since(earlier, {});
 TemporalHelpers.assertDuration(implicit, 0, 0, 0, 0, 1, 1, 1, 987, 654, 321, "default smallestUnit is nanosecond");
+const lambda = later.since(earlier, () => {});
+TemporalHelpers.assertDuration(lambda, 0, 0, 0, 0, 1, 1, 1, 987, 654, 321, "default smallestUnit is nanosecond");
diff --git a/test/built-ins/Temporal/PlainTime/prototype/subtract/argument-object-invalid.js b/test/built-ins/Temporal/PlainTime/prototype/subtract/argument-object-invalid.js
new file mode 100644
index 0000000000..df7fcaa34a
--- /dev/null
+++ b/test/built-ins/Temporal/PlainTime/prototype/subtract/argument-object-invalid.js
@@ -0,0 +1,13 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaintime.prototype.subtract
+description: Mixed positive and negative values or missing properties always throw
+features: [Temporal]
+---*/
+
+const plainTime = new Temporal.PlainTime(12, 34, 56, 123, 987, 500);
+assert.throws(RangeError, () => plainTime.subtract({ hours: 1, minutes: -6 }), "mixed signs");
+assert.throws(TypeError, () => plainTime.subtract({}), "no properties");
+assert.throws(TypeError, () => plainTime.subtract({ hour: 12 }), "only singular 'hour' property");
diff --git a/test/built-ins/Temporal/PlainTime/prototype/subtract/options-ignored.js b/test/built-ins/Temporal/PlainTime/prototype/subtract/options-ignored.js
new file mode 100644
index 0000000000..551584ca3f
--- /dev/null
+++ b/test/built-ins/Temporal/PlainTime/prototype/subtract/options-ignored.js
@@ -0,0 +1,29 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaintime.prototype.subtract
+description: Options argument is ignored.
+includes: [temporalHelpers.js]
+features: [Symbol, Temporal]
+---*/
+
+const values = [
+  undefined,
+  null,
+  true,
+  "hello",
+  Symbol("foo"),
+  1,
+  1n,
+  {},
+  () => {},
+  { get overflow() { throw new Test262Error("should not get overflow") } },
+];
+
+const time = Temporal.PlainTime.from("15:23:30.123456789");
+for (const options of values) {
+  TemporalHelpers.assertPlainTime(time.subtract({ hours: 1 }, options),
+    14, 23, 30, 123, 456, 789);
+}
+
diff --git a/test/built-ins/Temporal/PlainTime/prototype/toString/basic.js b/test/built-ins/Temporal/PlainTime/prototype/toString/basic.js
new file mode 100644
index 0000000000..808197d64e
--- /dev/null
+++ b/test/built-ins/Temporal/PlainTime/prototype/toString/basic.js
@@ -0,0 +1,15 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaintime.prototype.tostring
+description: Basic tests for toString()
+features: [Temporal]
+---*/
+
+assert.sameValue(new Temporal.PlainTime(15, 23).toString(), "15:23:00");
+assert.sameValue(new Temporal.PlainTime(15, 23, 30).toString(), "15:23:30");
+assert.sameValue(new Temporal.PlainTime(15, 23, 30, 123).toString(), "15:23:30.123");
+assert.sameValue(new Temporal.PlainTime(15, 23, 30, 123, 400).toString(), "15:23:30.1234");
+assert.sameValue(new Temporal.PlainTime(15, 23, 30, 123, 456).toString(), "15:23:30.123456");
+assert.sameValue(new Temporal.PlainTime(15, 23, 30, 123, 456, 789).toString(), "15:23:30.123456789");
diff --git a/test/built-ins/Temporal/PlainTime/prototype/toString/fractionalseconddigits-auto.js b/test/built-ins/Temporal/PlainTime/prototype/toString/fractionalseconddigits-auto.js
new file mode 100644
index 0000000000..2bff43e90a
--- /dev/null
+++ b/test/built-ins/Temporal/PlainTime/prototype/toString/fractionalseconddigits-auto.js
@@ -0,0 +1,19 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaintime.prototype.tostring
+description: auto value for fractionalSecondDigits option
+features: [Temporal]
+---*/
+
+const tests = [
+  ["15:23", "15:23:00"],
+  ["15:23:30", "15:23:30"],
+  ["15:23:30.1234", "15:23:30.1234"],
+];
+
+for (const [input, expected] of tests) {
+  const plainTime = Temporal.PlainTime.from(input);
+  assert.sameValue(plainTime.toString({ fractionalSecondDigits: "auto" }), expected);
+}
diff --git a/test/built-ins/Temporal/PlainTime/prototype/toString/fractionalseconddigits-invalid-string.js b/test/built-ins/Temporal/PlainTime/prototype/toString/fractionalseconddigits-invalid-string.js
index 2ab8852f59..3d4ab17c43 100644
--- a/test/built-ins/Temporal/PlainTime/prototype/toString/fractionalseconddigits-invalid-string.js
+++ b/test/built-ins/Temporal/PlainTime/prototype/toString/fractionalseconddigits-invalid-string.js
@@ -16,4 +16,6 @@ features: [Temporal]
 
 const time = new Temporal.PlainTime(12, 34, 56, 987, 650, 0);
 
-assert.throws(RangeError, () => time.toString({ fractionalSecondDigits: "other string" }));
+for (const fractionalSecondDigits of ["other string", "AUTO", "not-auto", "autos"]) {
+  assert.throws(RangeError, () => time.toString({ fractionalSecondDigits }));
+}
diff --git a/test/built-ins/Temporal/PlainTime/prototype/toString/fractionalseconddigits-number.js b/test/built-ins/Temporal/PlainTime/prototype/toString/fractionalseconddigits-number.js
new file mode 100644
index 0000000000..5973c53400
--- /dev/null
+++ b/test/built-ins/Temporal/PlainTime/prototype/toString/fractionalseconddigits-number.js
@@ -0,0 +1,22 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaintime.prototype.tostring
+description: Number for fractionalSecondDigits option
+features: [Temporal]
+---*/
+
+const t1 = Temporal.PlainTime.from("15:23");
+const t2 = Temporal.PlainTime.from("15:23:30");
+const t3 = Temporal.PlainTime.from("15:23:30.1234");
+assert.sameValue(t3.toString({ fractionalSecondDigits: 0 }), "15:23:30");
+assert.sameValue(t1.toString({ fractionalSecondDigits: 2 }), "15:23:00.00");
+assert.sameValue(t2.toString({ fractionalSecondDigits: 2 }), "15:23:30.00");
+assert.sameValue(t3.toString({ fractionalSecondDigits: 2 }), "15:23:30.12");
+assert.sameValue(t3.toString({ fractionalSecondDigits: 3 }), "15:23:30.123");
+assert.sameValue(t3.toString({ fractionalSecondDigits: 6 }), "15:23:30.123400");
+assert.sameValue(t1.toString({ fractionalSecondDigits: 7 }), "15:23:00.0000000");
+assert.sameValue(t2.toString({ fractionalSecondDigits: 7 }), "15:23:30.0000000");
+assert.sameValue(t3.toString({ fractionalSecondDigits: 7 }), "15:23:30.1234000");
+assert.sameValue(t3.toString({ fractionalSecondDigits: 9 }), "15:23:30.123400000");
diff --git a/test/built-ins/Temporal/PlainTime/prototype/toString/fractionalseconddigits-out-of-range.js b/test/built-ins/Temporal/PlainTime/prototype/toString/fractionalseconddigits-out-of-range.js
index d9b2f9c2ae..5959dd9459 100644
--- a/test/built-ins/Temporal/PlainTime/prototype/toString/fractionalseconddigits-out-of-range.js
+++ b/test/built-ins/Temporal/PlainTime/prototype/toString/fractionalseconddigits-out-of-range.js
@@ -16,5 +16,7 @@ features: [Temporal]
 
 const time = new Temporal.PlainTime(12, 34, 56, 987, 650, 0);
 
+assert.throws(RangeError, () => time.toString({ fractionalSecondDigits: -Infinity }));
 assert.throws(RangeError, () => time.toString({ fractionalSecondDigits: -1 }));
 assert.throws(RangeError, () => time.toString({ fractionalSecondDigits: 10 }));
+assert.throws(RangeError, () => time.toString({ fractionalSecondDigits: Infinity }));
diff --git a/test/built-ins/Temporal/PlainTime/prototype/toString/fractionalseconddigits-undefined.js b/test/built-ins/Temporal/PlainTime/prototype/toString/fractionalseconddigits-undefined.js
index f4d320b047..1d9d2dff03 100644
--- a/test/built-ins/Temporal/PlainTime/prototype/toString/fractionalseconddigits-undefined.js
+++ b/test/built-ins/Temporal/PlainTime/prototype/toString/fractionalseconddigits-undefined.js
@@ -16,10 +16,21 @@ info: |
 features: [Temporal]
 ---*/
 
-const time = new Temporal.PlainTime(12, 34, 56, 987, 650, 0);
+const tests = [
+  ["15:23", "15:23:00"],
+  ["15:23:30", "15:23:30"],
+  ["15:23:30.1234", "15:23:30.1234"],
+];
 
-const explicit = time.toString({ fractionalSecondDigits: undefined });
-assert.sameValue(explicit, "12:34:56.98765", "default fractionalSecondDigits is auto");
+for (const [input, expected] of tests) {
+  const time = Temporal.PlainTime.from(input);
 
-const implicit = time.toString({});
-assert.sameValue(implicit, "12:34:56.98765", "default fractionalSecondDigits is auto");
+  const explicit = time.toString({ fractionalSecondDigits: undefined });
+  assert.sameValue(explicit, expected, "default fractionalSecondDigits is auto");
+
+  const implicit = time.toString({});
+  assert.sameValue(implicit, expected, "default fractionalSecondDigits is auto");
+
+  const lambda = time.toString(() => {});
+  assert.sameValue(lambda, expected, "default fractionalSecondDigits is auto");
+}
diff --git a/test/built-ins/Temporal/PlainTime/prototype/toString/options-invalid.js b/test/built-ins/Temporal/PlainTime/prototype/toString/options-invalid.js
new file mode 100644
index 0000000000..b0f50e943d
--- /dev/null
+++ b/test/built-ins/Temporal/PlainTime/prototype/toString/options-invalid.js
@@ -0,0 +1,15 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaintime.prototype.tostring
+description: TypeError thrown when a primitive is passed as the options argument
+features: [Temporal]
+---*/
+
+const instance = Temporal.PlainTime.from("12:56:32");
+const values = [null, true, "hello", Symbol("foo"), 1, 1n];
+
+for (const badOptions of values) {
+  assert.throws(TypeError, () => instance.toString(badOptions));
+}
diff --git a/test/built-ins/Temporal/PlainTime/prototype/toString/options-undefined.js b/test/built-ins/Temporal/PlainTime/prototype/toString/options-undefined.js
index 9299685b31..c03c5994cb 100644
--- a/test/built-ins/Temporal/PlainTime/prototype/toString/options-undefined.js
+++ b/test/built-ins/Temporal/PlainTime/prototype/toString/options-undefined.js
@@ -7,14 +7,18 @@ description: Verify that undefined options are handled correctly.
 features: [Temporal]
 ---*/
 
-const time = new Temporal.PlainTime(12, 34, 56, 987, 650);
-const expected = "12:34:56.98765";
+const tests = [
+  ["15:23", "15:23:00"],
+  ["15:23:30", "15:23:30"],
+  ["15:23:30.1234", "15:23:30.1234"],
+];
 
-const explicit = time.toString(undefined);
-assert.sameValue(explicit, expected, "default precision is auto and no rounding");
+for (const [input, expected] of tests) {
+  const time = Temporal.PlainTime.from(input);
 
-const propertyImplicit = time.toString({});
-assert.sameValue(propertyImplicit, expected, "default precision is auto and no rounding");
+  const explicit = time.toString(undefined);
+  assert.sameValue(explicit, expected, "default precision is auto and no rounding");
 
-const implicit = time.toString();
-assert.sameValue(implicit, expected, "default precision is auto and no rounding");
+  const implicit = time.toString();
+  assert.sameValue(implicit, expected, "default precision is auto and no rounding");
+}
diff --git a/test/built-ins/Temporal/PlainTime/prototype/toString/rounding-cross-midnight.js b/test/built-ins/Temporal/PlainTime/prototype/toString/rounding-cross-midnight.js
new file mode 100644
index 0000000000..4c67d223aa
--- /dev/null
+++ b/test/built-ins/Temporal/PlainTime/prototype/toString/rounding-cross-midnight.js
@@ -0,0 +1,13 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaintime.prototype.tostring
+description: Rounding can cross midnight
+features: [Temporal]
+---*/
+
+const plainTime = Temporal.PlainTime.from("23:59:59.999999999");
+for (const roundingMode of ["ceil", "halfExpand"]) {
+  assert.sameValue(plainTime.toString({ fractionalSecondDigits: 8, roundingMode }), "00:00:00.00000000");
+}
diff --git a/test/built-ins/Temporal/PlainTime/prototype/toString/roundingmode-ceil.js b/test/built-ins/Temporal/PlainTime/prototype/toString/roundingmode-ceil.js
new file mode 100644
index 0000000000..4f6552b87b
--- /dev/null
+++ b/test/built-ins/Temporal/PlainTime/prototype/toString/roundingmode-ceil.js
@@ -0,0 +1,19 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaintime.prototype.tostring
+description: ceil value for roundingMode option
+features: [Temporal]
+---*/
+
+const time = new Temporal.PlainTime(12, 34, 56, 123, 987, 500);
+
+const result1 = time.toString({ smallestUnit: "microsecond", roundingMode: "ceil" });
+assert.sameValue(result1, "12:34:56.123988", "roundingMode is ceil");
+
+const result2 = time.toString({ smallestUnit: "millisecond", roundingMode: "ceil" });
+assert.sameValue(result2, "12:34:56.124", "roundingMode is ceil");
+
+const result3 = time.toString({ smallestUnit: "second", roundingMode: "ceil" });
+assert.sameValue(result3, "12:34:57", "roundingMode is ceil");
diff --git a/test/built-ins/Temporal/PlainTime/prototype/toString/roundingmode-floor.js b/test/built-ins/Temporal/PlainTime/prototype/toString/roundingmode-floor.js
new file mode 100644
index 0000000000..63b30d3cc5
--- /dev/null
+++ b/test/built-ins/Temporal/PlainTime/prototype/toString/roundingmode-floor.js
@@ -0,0 +1,19 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaintime.prototype.tostring
+description: floor value for roundingMode option
+features: [Temporal]
+---*/
+
+const time = new Temporal.PlainTime(12, 34, 56, 123, 987, 500);
+
+const result1 = time.toString({ smallestUnit: "microsecond", roundingMode: "floor" });
+assert.sameValue(result1, "12:34:56.123987", "roundingMode is floor");
+
+const result2 = time.toString({ smallestUnit: "millisecond", roundingMode: "floor" });
+assert.sameValue(result2, "12:34:56.123", "roundingMode is floor");
+
+const result3 = time.toString({ smallestUnit: "second", roundingMode: "floor" });
+assert.sameValue(result3, "12:34:56", "roundingMode is floor");
diff --git a/test/built-ins/Temporal/PlainTime/prototype/toString/roundingmode-halfExpand.js b/test/built-ins/Temporal/PlainTime/prototype/toString/roundingmode-halfExpand.js
new file mode 100644
index 0000000000..cd7b8e4673
--- /dev/null
+++ b/test/built-ins/Temporal/PlainTime/prototype/toString/roundingmode-halfExpand.js
@@ -0,0 +1,19 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaintime.prototype.tostring
+description: halfExpand value for roundingMode option
+features: [Temporal]
+---*/
+
+const time = new Temporal.PlainTime(12, 34, 56, 123, 987, 500);
+
+const result1 = time.toString({ smallestUnit: "microsecond", roundingMode: "halfExpand" });
+assert.sameValue(result1, "12:34:56.123988", "roundingMode is halfExpand");
+
+const result2 = time.toString({ smallestUnit: "millisecond", roundingMode: "halfExpand" });
+assert.sameValue(result2, "12:34:56.124", "roundingMode is halfExpand");
+
+const result3 = time.toString({ smallestUnit: "second", roundingMode: "halfExpand" });
+assert.sameValue(result3, "12:34:56", "roundingMode is halfExpand");
diff --git a/test/built-ins/Temporal/PlainTime/prototype/toString/roundingmode-invalid-string.js b/test/built-ins/Temporal/PlainTime/prototype/toString/roundingmode-invalid-string.js
index 902833f63c..529541f2ad 100644
--- a/test/built-ins/Temporal/PlainTime/prototype/toString/roundingmode-invalid-string.js
+++ b/test/built-ins/Temporal/PlainTime/prototype/toString/roundingmode-invalid-string.js
@@ -8,4 +8,6 @@ features: [Temporal]
 ---*/
 
 const time = new Temporal.PlainTime(12, 34, 56, 123, 987, 500);
-assert.throws(RangeError, () => time.toString({ smallestUnit: "microsecond", roundingMode: "other string" }));
+for (const roundingMode of ["other string", "cile", "CEIL", "ce\u0131l"]) {
+  assert.throws(RangeError, () => time.toString({ smallestUnit: "microsecond", roundingMode }));
+}
diff --git a/test/built-ins/Temporal/PlainTime/prototype/toString/roundingmode-trunc.js b/test/built-ins/Temporal/PlainTime/prototype/toString/roundingmode-trunc.js
new file mode 100644
index 0000000000..e25101caf4
--- /dev/null
+++ b/test/built-ins/Temporal/PlainTime/prototype/toString/roundingmode-trunc.js
@@ -0,0 +1,19 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaintime.prototype.tostring
+description: trunc value for roundingMode option
+features: [Temporal]
+---*/
+
+const time = new Temporal.PlainTime(12, 34, 56, 123, 987, 500);
+
+const result1 = time.toString({ smallestUnit: "microsecond", roundingMode: "trunc" });
+assert.sameValue(result1, "12:34:56.123987", "roundingMode is trunc");
+
+const result2 = time.toString({ smallestUnit: "millisecond", roundingMode: "trunc" });
+assert.sameValue(result2, "12:34:56.123", "roundingMode is trunc");
+
+const result3 = time.toString({ smallestUnit: "second", roundingMode: "trunc" });
+assert.sameValue(result3, "12:34:56", "roundingMode is trunc");
diff --git a/test/built-ins/Temporal/PlainTime/prototype/toString/smallestunit-fractionalseconddigits.js b/test/built-ins/Temporal/PlainTime/prototype/toString/smallestunit-fractionalseconddigits.js
new file mode 100644
index 0000000000..06ab3baac6
--- /dev/null
+++ b/test/built-ins/Temporal/PlainTime/prototype/toString/smallestunit-fractionalseconddigits.js
@@ -0,0 +1,31 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaintime.prototype.tostring
+description: fractionalSecondDigits option is not used with smallestUnit present
+features: [Temporal]
+---*/
+
+const time = new Temporal.PlainTime(12, 34, 56, 789, 999, 999);
+const tests = [
+  ["minute", "12:34"],
+  ["second", "12:34:56"],
+  ["millisecond", "12:34:56.789"],
+  ["microsecond", "12:34:56.789999"],
+  ["nanosecond", "12:34:56.789999999"],
+];
+
+for (const [smallestUnit, expected] of tests) {
+  const string = time.toString({
+    smallestUnit,
+    get fractionalSecondDigits() { throw new Test262Error("should not get fractionalSecondDigits") }
+  });
+  assert.sameValue(string, expected, smallestUnit);
+}
+
+assert.throws(RangeError, () => time.toString({
+  smallestUnit: "hour",
+  get fractionalSecondDigits() { throw new Test262Error("should not get fractionalSecondDigits") }
+}));
+
diff --git a/test/built-ins/Temporal/PlainTime/prototype/toString/smallestunit-invalid-string.js b/test/built-ins/Temporal/PlainTime/prototype/toString/smallestunit-invalid-string.js
index 583b5696e9..d5ea0a7b3e 100644
--- a/test/built-ins/Temporal/PlainTime/prototype/toString/smallestunit-invalid-string.js
+++ b/test/built-ins/Temporal/PlainTime/prototype/toString/smallestunit-invalid-string.js
@@ -8,4 +8,6 @@ features: [Temporal]
 ---*/
 
 const time = new Temporal.PlainTime(12, 34, 56, 123, 987, 500);
-assert.throws(RangeError, () => time.toString({ smallestUnit: "other string" }));
+for (const smallestUnit of ["era", "year", "month", "day", "hour", "nonsense", "other string", "m\u0131nute", "SECOND"]) {
+  assert.throws(RangeError, () => time.toString({ smallestUnit }));
+}
diff --git a/test/built-ins/Temporal/PlainTime/prototype/toString/smallestunit-valid-units.js b/test/built-ins/Temporal/PlainTime/prototype/toString/smallestunit-valid-units.js
index beb5fe4cb1..e2b4c71dbd 100644
--- a/test/built-ins/Temporal/PlainTime/prototype/toString/smallestunit-valid-units.js
+++ b/test/built-ins/Temporal/PlainTime/prototype/toString/smallestunit-valid-units.js
@@ -8,13 +8,19 @@ features: [Temporal]
 ---*/
 
 const time = new Temporal.PlainTime(12, 34, 56, 789, 999, 999);
-
 assert.sameValue(time.toString({ smallestUnit: "minute" }), "12:34");
 assert.sameValue(time.toString({ smallestUnit: "second" }), "12:34:56");
 assert.sameValue(time.toString({ smallestUnit: "millisecond" }), "12:34:56.789");
 assert.sameValue(time.toString({ smallestUnit: "microsecond" }), "12:34:56.789999");
 assert.sameValue(time.toString({ smallestUnit: "nanosecond" }), "12:34:56.789999999");
 
+const time2 = new Temporal.PlainTime(12, 34);
+assert.sameValue(time2.toString({ smallestUnit: "minute" }), "12:34");
+assert.sameValue(time2.toString({ smallestUnit: "second" }), "12:34:00");
+assert.sameValue(time2.toString({ smallestUnit: "millisecond" }), "12:34:00.000");
+assert.sameValue(time2.toString({ smallestUnit: "microsecond" }), "12:34:00.000000");
+assert.sameValue(time2.toString({ smallestUnit: "nanosecond" }), "12:34:00.000000000");
+
 const notValid = [
   "year",
   "month",
diff --git a/test/built-ins/Temporal/PlainTime/prototype/until/options-invalid.js b/test/built-ins/Temporal/PlainTime/prototype/until/options-invalid.js
new file mode 100644
index 0000000000..dadc6fdfe2
--- /dev/null
+++ b/test/built-ins/Temporal/PlainTime/prototype/until/options-invalid.js
@@ -0,0 +1,16 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaintime.prototype.until
+description: TypeError thrown when a primitive is passed as the options argument
+features: [Temporal]
+---*/
+
+const values = [null, true, "hello", Symbol("foo"), 1, 1n];
+const time = new Temporal.PlainTime(15, 23, 30, 123, 456, 789);
+const one = new Temporal.PlainTime(16, 23, 30, 123, 456, 789);
+
+for (const badOptions of values) {
+  assert.throws(TypeError, () => time.until(one, badOptions));
+}
diff --git a/test/built-ins/Temporal/PlainTime/prototype/until/options-undefined.js b/test/built-ins/Temporal/PlainTime/prototype/until/options-undefined.js
index c4b3886713..7bfafe8302 100644
--- a/test/built-ins/Temporal/PlainTime/prototype/until/options-undefined.js
+++ b/test/built-ins/Temporal/PlainTime/prototype/until/options-undefined.js
@@ -14,6 +14,6 @@ const explicit = earlier.until(later, undefined);
 assert.sameValue(explicit.hours, 6, "default largest unit is hours");
 assert.sameValue(explicit.nanoseconds, 1, "default smallest unit is nanoseconds and no rounding");
 
-const implicit = earlier.until(later, undefined);
+const implicit = earlier.until(later);
 assert.sameValue(implicit.hours, 6, "default largest unit is hours");
 assert.sameValue(implicit.nanoseconds, 1, "default smallest unit is nanoseconds and no rounding");
diff --git a/test/built-ins/Temporal/PlainTime/prototype/until/roundingmode-invalid-string.js b/test/built-ins/Temporal/PlainTime/prototype/until/roundingmode-invalid-string.js
index 48cd2a79bc..b92eec08a5 100644
--- a/test/built-ins/Temporal/PlainTime/prototype/until/roundingmode-invalid-string.js
+++ b/test/built-ins/Temporal/PlainTime/prototype/until/roundingmode-invalid-string.js
@@ -9,4 +9,6 @@ features: [Temporal]
 
 const earlier = new Temporal.PlainTime(12, 34, 56, 0, 0, 0);
 const later = new Temporal.PlainTime(13, 35, 57, 123, 987, 500);
-assert.throws(RangeError, () => earlier.until(later, { smallestUnit: "microsecond", roundingMode: "other string" }));
+for (const roundingMode of ["other string", "cile", "CEIL", "ce\u0131l"]) {
+  assert.throws(RangeError, () => earlier.until(later, { smallestUnit: "microsecond", roundingMode }));
+}
diff --git a/test/built-ins/Temporal/PlainTime/prototype/until/smallestunit-undefined.js b/test/built-ins/Temporal/PlainTime/prototype/until/smallestunit-undefined.js
index e48c684e9a..0bc7b0dc8e 100644
--- a/test/built-ins/Temporal/PlainTime/prototype/until/smallestunit-undefined.js
+++ b/test/built-ins/Temporal/PlainTime/prototype/until/smallestunit-undefined.js
@@ -15,3 +15,5 @@ const explicit = earlier.until(later, { smallestUnit: undefined });
 TemporalHelpers.assertDuration(explicit, 0, 0, 0, 0, 1, 1, 1, 987, 654, 321, "default smallestUnit is nanosecond");
 const implicit = earlier.until(later, {});
 TemporalHelpers.assertDuration(implicit, 0, 0, 0, 0, 1, 1, 1, 987, 654, 321, "default smallestUnit is nanosecond");
+const lambda = earlier.until(later, () => {});
+TemporalHelpers.assertDuration(lambda, 0, 0, 0, 0, 1, 1, 1, 987, 654, 321, "default smallestUnit is nanosecond");
diff --git a/test/built-ins/Temporal/PlainTime/prototype/valueOf/basic.js b/test/built-ins/Temporal/PlainTime/prototype/valueOf/basic.js
new file mode 100644
index 0000000000..65a920387f
--- /dev/null
+++ b/test/built-ins/Temporal/PlainTime/prototype/valueOf/basic.js
@@ -0,0 +1,21 @@
+// Copyright (C) 2022 Igalia, S.L. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-temporal.plaintime.prototype.valueof
+description: Basic tests for valueOf().
+features: [Temporal]
+---*/
+
+const plainTime = Temporal.PlainTime.from("09:36:29.123456789");
+const plainTime2 = Temporal.PlainTime.from("09:36:29.123456789");
+
+assert.throws(TypeError, () => plainTime.valueOf(), "valueOf");
+assert.throws(TypeError, () => plainTime < plainTime, "<");
+assert.throws(TypeError, () => plainTime <= plainTime, "<=");
+assert.throws(TypeError, () => plainTime > plainTime, ">");
+assert.throws(TypeError, () => plainTime >= plainTime, ">=");
+assert.sameValue(plainTime === plainTime, true, "===");
+assert.sameValue(plainTime === plainTime2, false, "===");
+assert.sameValue(plainTime !== plainTime, false, "!==");
+assert.sameValue(plainTime !== plainTime2, true, "!==");