This is a testharness.js-based test.
FAIL console.count()'s label gets converted to string via label.toString() when label is an object assert_true: count() must call toString() on label when label is an object expected true got false
FAIL console.count() throws exceptions generated by erroneous label.toString() conversion assert_throws: count must re-throw any exceptions thrown by label.toString() conversion function "() => {
      console[method]({
        toString() {
          throw new Error('conversion error');
        }
      });
    }" did not throw
FAIL console.countReset()'s label gets converted to string via label.toString() when label is an object assert_true: countReset() must call toString() on label when label is an object expected true got false
FAIL console.countReset() throws exceptions generated by erroneous label.toString() conversion assert_throws: countReset must re-throw any exceptions thrown by label.toString() conversion function "() => {
      console[method]({
        toString() {
          throw new Error('conversion error');
        }
      });
    }" did not throw
FAIL console.time()'s label gets converted to string via label.toString() when label is an object assert_true: time() must call toString() on label when label is an object expected true got false
FAIL console.time() throws exceptions generated by erroneous label.toString() conversion assert_throws: time must re-throw any exceptions thrown by label.toString() conversion function "() => {
      console[method]({
        toString() {
          throw new Error('conversion error');
        }
      });
    }" did not throw
FAIL console.timeLog()'s label gets converted to string via label.toString() when label is an object assert_true: timeLog() must call toString() on label when label is an object expected true got false
FAIL console.timeLog() throws exceptions generated by erroneous label.toString() conversion assert_throws: timeLog must re-throw any exceptions thrown by label.toString() conversion function "() => {
      console[method]({
        toString() {
          throw new Error('conversion error');
        }
      });
    }" did not throw
FAIL console.timeEnd()'s label gets converted to string via label.toString() when label is an object assert_true: timeEnd() must call toString() on label when label is an object expected true got false
FAIL console.timeEnd() throws exceptions generated by erroneous label.toString() conversion assert_throws: timeEnd must re-throw any exceptions thrown by label.toString() conversion function "() => {
      console[method]({
        toString() {
          throw new Error('conversion error');
        }
      });
    }" did not throw
Harness: the test ran to completion.

