| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122 | var tape = require('tape')var thunky = require('./')tape('run only once', function (t) {  t.plan(3)  var ran = 0  var run = thunky(function (cb) {    ran++    cb()  })  run(function () {    t.same(ran, 1, 'ran once')  })  run(function () {    t.same(ran, 1, 'ran once')  })  run(function () {    t.same(ran, 1, 'ran once')  })})tape('run only once async', function (t) {  t.plan(3)  var ran = 0  var run = thunky(function (cb) {    process.nextTick(function () {      ran++      cb()    })  })  run(function () {    t.same(ran, 1, 'ran once')  })  run(function () {    t.same(ran, 1, 'ran once')  })  run(function () {    t.same(ran, 1, 'ran once')  })})tape('re-run on error', function (t) {  t.plan(3)  var ran = 0  var run = thunky(function (cb) {    ran++    cb(new Error('stop'))  })  run(function () {    t.same(ran, 1, 'ran once')    run(function () {      t.same(ran, 2, 'ran once')      run(function () {        t.same(ran, 3, 'ran once')      })    })  })})tape('pass arguments', function (t) {  t.plan(6)  var ran = 0  var run = thunky(function (fn) {    ran++    fn({ hello: 'world' })  })  run(function (val) {    t.same(ran, 1, 'ran once')    t.same(val, { hello: 'world' })    run(function (val) {      t.same(ran, 1, 'ran once')      t.same(val, { hello: 'world' })      run(function (val) {        t.same(ran, 1, 'ran once')        t.same(val, { hello: 'world' })      })    })  })})tape('callback is optional', function (t) {  t.plan(2)  var ran = 0  var run = thunky(function (fn) {    ran++    fn({ hello: 'world' })  })  run()  run(function (val) {    t.same(ran, 1, 'ran once')    t.same(val, { hello: 'world' })  })})tape('always async', function (t) {  t.plan(2)  var run = thunky(function (cb) {    process.nextTick(cb)  })  var sync = true  run(function () {    t.ok(!sync, 'not sync')    var innerSync = true    run(function () {      t.ok(!innerSync, 'not sync')    })    innerSync = false  })  sync = false})
 |