FAIL test/cart.test.js
  ● discounts › applies SAVE10

    TypeError: Cannot read properties of undefined (reading 'SAVE10')

    [0m [90m  6 |[39m
     [90m  7 |[39m [36mfunction[39m applyDiscount(cart[33m,[39m code) {
    [31m[1m>[22m[39m[90m  8 |[39m   [36mconst[39m rate [33m=[39m cart[33m.[39mdiscounts[code][33m.[39mrate[33m;[39m
     [90m    |[39m                              [31m[1m^[22m[39m
     [90m  9 |[39m   [36mreturn[39m [33mMath[39m[33m.[39mround(total(cart[33m.[39mitems) [33m*[39m ([35m1[39m [33m-[39m rate))[33m;[39m
     [90m 10 |[39m }
     [90m 11 |[39m[0m

      at applyDiscount (src/cart.js:8:30)
      at Object.applyDiscount (test/cart.test.js:8:14)

  ● discounts › applies SAVE20

    TypeError: Cannot read properties of undefined (reading 'SAVE20')

    [0m [90m  6 |[39m
     [90m  7 |[39m [36mfunction[39m applyDiscount(cart[33m,[39m code) {
    [31m[1m>[22m[39m[90m  8 |[39m   [36mconst[39m rate [33m=[39m cart[33m.[39mdiscounts[code][33m.[39mrate[33m;[39m
     [90m    |[39m                              [31m[1m^[22m[39m
     [90m  9 |[39m   [36mreturn[39m [33mMath[39m[33m.[39mround(total(cart[33m.[39mitems) [33m*[39m ([35m1[39m [33m-[39m rate))[33m;[39m
     [90m 10 |[39m }
     [90m 11 |[39m[0m

      at applyDiscount (src/cart.js:8:30)
      at Object.applyDiscount (test/cart.test.js:8:14)

  ● discounts › applies WELCOME

    TypeError: Cannot read properties of undefined (reading 'WELCOME')

    [0m [90m  6 |[39m
     [90m  7 |[39m [36mfunction[39m applyDiscount(cart[33m,[39m code) {
    [31m[1m>[22m[39m[90m  8 |[39m   [36mconst[39m rate [33m=[39m cart[33m.[39mdiscounts[code][33m.[39mrate[33m;[39m
     [90m    |[39m                              [31m[1m^[22m[39m
     [90m  9 |[39m   [36mreturn[39m [33mMath[39m[33m.[39mround(total(cart[33m.[39mitems) [33m*[39m ([35m1[39m [33m-[39m rate))[33m;[39m
     [90m 10 |[39m }
     [90m 11 |[39m[0m

      at applyDiscount (src/cart.js:8:30)
      at Object.applyDiscount (test/cart.test.js:8:14)

  ● discounts › applies SPRING

    TypeError: Cannot read properties of undefined (reading 'SPRING')

    [0m [90m  6 |[39m
     [90m  7 |[39m [36mfunction[39m applyDiscount(cart[33m,[39m code) {
    [31m[1m>[22m[39m[90m  8 |[39m   [36mconst[39m rate [33m=[39m cart[33m.[39mdiscounts[code][33m.[39mrate[33m;[39m
     [90m    |[39m                              [31m[1m^[22m[39m
     [90m  9 |[39m   [36mreturn[39m [33mMath[39m[33m.[39mround(total(cart[33m.[39mitems) [33m*[39m ([35m1[39m [33m-[39m rate))[33m;[39m
     [90m 10 |[39m }
     [90m 11 |[39m[0m

      at applyDiscount (src/cart.js:8:30)
      at Object.applyDiscount (test/cart.test.js:8:14)

  ● discounts › applies VIP

    TypeError: Cannot read properties of undefined (reading 'VIP')

    [0m [90m  6 |[39m
     [90m  7 |[39m [36mfunction[39m applyDiscount(cart[33m,[39m code) {
    [31m[1m>[22m[39m[90m  8 |[39m   [36mconst[39m rate [33m=[39m cart[33m.[39mdiscounts[code][33m.[39mrate[33m;[39m
     [90m    |[39m                              [31m[1m^[22m[39m
     [90m  9 |[39m   [36mreturn[39m [33mMath[39m[33m.[39mround(total(cart[33m.[39mitems) [33m*[39m ([35m1[39m [33m-[39m rate))[33m;[39m
     [90m 10 |[39m }
     [90m 11 |[39m[0m

      at applyDiscount (src/cart.js:8:30)
      at Object.applyDiscount (test/cart.test.js:8:14)

  ● discounts › applies BULK

    TypeError: Cannot read properties of undefined (reading 'BULK')

    [0m [90m  6 |[39m
     [90m  7 |[39m [36mfunction[39m applyDiscount(cart[33m,[39m code) {
    [31m[1m>[22m[39m[90m  8 |[39m   [36mconst[39m rate [33m=[39m cart[33m.[39mdiscounts[code][33m.[39mrate[33m;[39m
     [90m    |[39m                              [31m[1m^[22m[39m
     [90m  9 |[39m   [36mreturn[39m [33mMath[39m[33m.[39mround(total(cart[33m.[39mitems) [33m*[39m ([35m1[39m [33m-[39m rate))[33m;[39m
     [90m 10 |[39m }
     [90m 11 |[39m[0m

      at applyDiscount (src/cart.js:8:30)
      at Object.applyDiscount (test/cart.test.js:8:14)

  ● tax › tax(100) is 108

    expect(received).toBe(expected) // Object.is equality

    Expected: 108
    Received: 110

    [0m [90m 13 |[39m describe([32m"tax"[39m[33m,[39m () [33m=>[39m {
     [90m 14 |[39m   test[33m.[39meach([[[35m100[39m[33m,[39m [35m108[39m][33m,[39m [[35m1000[39m[33m,[39m [35m1080[39m][33m,[39m [[35m2500[39m[33m,[39m [35m2700[39m]])([32m"tax(%i) is %i"[39m[33m,[39m (amount[33m,[39m expected) [33m=>[39m {
    [31m[1m>[22m[39m[90m 15 |[39m     expect(tax(amount))[33m.[39mtoBe(expected)[33m;[39m
     [90m    |[39m                         [31m[1m^[22m[39m
     [90m 16 |[39m   })[33m;[39m
     [90m 17 |[39m })[33m;[39m
     [90m 18 |[39m[0m

      at toBe (test/cart.test.js:15:25)

  ● tax › tax(1000) is 1080

    expect(received).toBe(expected) // Object.is equality

    Expected: 1080
    Received: 1100

    [0m [90m 13 |[39m describe([32m"tax"[39m[33m,[39m () [33m=>[39m {
     [90m 14 |[39m   test[33m.[39meach([[[35m100[39m[33m,[39m [35m108[39m][33m,[39m [[35m1000[39m[33m,[39m [35m1080[39m][33m,[39m [[35m2500[39m[33m,[39m [35m2700[39m]])([32m"tax(%i) is %i"[39m[33m,[39m (amount[33m,[39m expected) [33m=>[39m {
    [31m[1m>[22m[39m[90m 15 |[39m     expect(tax(amount))[33m.[39mtoBe(expected)[33m;[39m
     [90m    |[39m                         [31m[1m^[22m[39m
     [90m 16 |[39m   })[33m;[39m
     [90m 17 |[39m })[33m;[39m
     [90m 18 |[39m[0m

      at toBe (test/cart.test.js:15:25)

  ● tax › tax(2500) is 2700

    expect(received).toBe(expected) // Object.is equality

    Expected: 2700
    Received: 2750

    [0m [90m 13 |[39m describe([32m"tax"[39m[33m,[39m () [33m=>[39m {
     [90m 14 |[39m   test[33m.[39meach([[[35m100[39m[33m,[39m [35m108[39m][33m,[39m [[35m1000[39m[33m,[39m [35m1080[39m][33m,[39m [[35m2500[39m[33m,[39m [35m2700[39m]])([32m"tax(%i) is %i"[39m[33m,[39m (amount[33m,[39m expected) [33m=>[39m {
    [31m[1m>[22m[39m[90m 15 |[39m     expect(tax(amount))[33m.[39mtoBe(expected)[33m;[39m
     [90m    |[39m                         [31m[1m^[22m[39m
     [90m 16 |[39m   })[33m;[39m
     [90m 17 |[39m })[33m;[39m
     [90m 18 |[39m[0m

      at toBe (test/cart.test.js:15:25)

  ● checkout reserves stock

    out of stock: book-2

    [0m [90m 3 |[39m [36mfunction[39m reserve(sku[33m,[39m qty) {
     [90m 4 |[39m   [36mif[39m ((stock[sku] [33m?[39m[33m?[39m [35m0[39m) [33m<[39m qty) {
    [31m[1m>[22m[39m[90m 5 |[39m     [36mthrow[39m [36mnew[39m [33mError[39m([32m`out of stock: ${sku}`[39m)[33m;[39m
     [90m   |[39m           [31m[1m^[22m[39m
     [90m 6 |[39m   }
     [90m 7 |[39m   stock[sku] [33m-=[39m qty[33m;[39m
     [90m 8 |[39m }[0m

      at reserve (src/inventory.js:5:11)
      at reserve (src/cart.js:17:32)
          at Array.forEach (<anonymous>)
      at forEach (src/cart.js:17:14)
      at Object.checkout (test/cart.test.js:24:10)

FAIL test/inventory.test.js
  ● Console

    console.log
      reserving book-2

      at Object.log (test/inventory.test.js:4:11)

  ● reserves a sold-out book

    out of stock: book-2

    [0m [90m 3 |[39m [36mfunction[39m reserve(sku[33m,[39m qty) {
     [90m 4 |[39m   [36mif[39m ((stock[sku] [33m?[39m[33m?[39m [35m0[39m) [33m<[39m qty) {
    [31m[1m>[22m[39m[90m 5 |[39m     [36mthrow[39m [36mnew[39m [33mError[39m([32m`out of stock: ${sku}`[39m)[33m;[39m
     [90m   |[39m           [31m[1m^[22m[39m
     [90m 6 |[39m   }
     [90m 7 |[39m   stock[sku] [33m-=[39m qty[33m;[39m
     [90m 8 |[39m }[0m

      at reserve (src/inventory.js:5:11)
      at Object.reserve (test/inventory.test.js:5:3)

  ● reserves a sold-out book twice

    out of stock: book-2

    [0m [90m 3 |[39m [36mfunction[39m reserve(sku[33m,[39m qty) {
     [90m 4 |[39m   [36mif[39m ((stock[sku] [33m?[39m[33m?[39m [35m0[39m) [33m<[39m qty) {
    [31m[1m>[22m[39m[90m 5 |[39m     [36mthrow[39m [36mnew[39m [33mError[39m([32m`out of stock: ${sku}`[39m)[33m;[39m
     [90m   |[39m           [31m[1m^[22m[39m
     [90m 6 |[39m   }
     [90m 7 |[39m   stock[sku] [33m-=[39m qty[33m;[39m
     [90m 8 |[39m }[0m

      at reserve (src/inventory.js:5:11)
      at Object.reserve (test/inventory.test.js:9:3)

FAIL test/broken.test.js
  ● Test suite failed to run

    Cannot find module '../src/shipping' from 'test/broken.test.js'

    [0m[31m[1m>[22m[39m[90m 1 |[39m [36mconst[39m { ship } [33m=[39m require([32m"../src/shipping"[39m)[33m;[39m
     [90m   |[39m                  [31m[1m^[22m[39m
     [90m 2 |[39m
     [90m 3 |[39m test([32m"ships"[39m[33m,[39m () [33m=>[39m {
     [90m 4 |[39m   expect(ship())[33m.[39mtoBe([36mtrue[39m)[33m;[39m[0m

      at Resolver._throwModNotFoundError (node_modules/jest-resolve/build/index.js:1031:11)
      at Object.require (test/broken.test.js:1:18)

Test Suites: 3 failed, 3 total
Tests:       12 failed, 1 passed, 13 total
Snapshots:   0 total
Time:        0.14 s, estimated 1 s
Ran all test suites.
