TAP version 13
# Subtest: createPracticeItem
    # Subtest: creates an item with title, minutes, and an id
    ok 1 - creates an item with title, minutes, and an id
      ---
      duration_ms: 0.515984
      type: 'test'
      ...
    # Subtest: assigns distinct ids to successive items
    ok 2 - assigns distinct ids to successive items
      ---
      duration_ms: 0.116346
      type: 'test'
      ...
    # Subtest: rejects an empty title
    ok 3 - rejects an empty title
      ---
      duration_ms: 0.31372
      type: 'test'
      ...
    # Subtest: rejects non-positive minutes
    ok 4 - rejects non-positive minutes
      ---
      duration_ms: 0.116486
      type: 'test'
      ...
    1..4
ok 1 - createPracticeItem
  ---
  duration_ms: 2.21403
  type: 'suite'
  ...
# Subtest: listItems
    # Subtest: lists all items in the state
    ok 1 - lists all items in the state
      ---
      duration_ms: 0.516824
      type: 'test'
      ...
    # Subtest: returns copies, so mutating the list does not touch the state
    ok 2 - returns copies, so mutating the list does not touch the state
      ---
      duration_ms: 0.096947
      type: 'test'
      ...
    1..2
ok 2 - listItems
  ---
  duration_ms: 0.730577
  type: 'suite'
  ...
# Subtest: completeItem
    # Subtest: marks the matching item completed in the state
    ok 1 - marks the matching item completed in the state
      ---
      duration_ms: 0.211093
      type: 'test'
      ...
    # Subtest: throws for an unknown id
    ok 2 - throws for an unknown id
      ---
      duration_ms: 0.168354
      type: 'test'
      ...
    1..2
ok 3 - completeItem
  ---
  duration_ms: 0.608651
  type: 'suite'
  ...
1..3
# tests 8
# suites 3
# pass 8
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 54.342572
