js-factories
Version:
Object factory to create dynamic test fixtures
69 lines (58 loc) • 1.86 kB
text/coffeescript
((name, context, factory) ->
# Module systems magic dance.
if (typeof require == "function" && typeof exports == "object" && typeof module == "object")
# NodeJS
module.exports = factory()
else if (typeof define == "function" && define.amd)
# AMD
define -> factory()
else
# Other environment (usually <script> tag)
context[name] = factory()
)('Factory', this, ->
sequencer = (property) ->
value = if @sequences[property]?
@sequences[property] += 1
else
@sequences[property] = 0
if typeof(property) is 'function'
property(value)
else
value
Factory =
factories: {}
define: (factoryName, builder) ->
if factoryName.indexOf('-') > 0
throw new Error "Factory name '#{factoryName}' can't use - in name. It clashes with the traits construct"
if @factories[factoryName]?
throw new Error "Factory #{factoryName} is already defined"
@factories[factoryName] =
sequences: {}
factory: builder
create: (nameWithTraits, args...) ->
traits = nameWithTraits.split '-'
factoryName = traits.pop()
unless @factories[factoryName]?
throw new Error "Factory #{factoryName} does not exist"
f = @factories[factoryName]
obj =
sequences: f.sequences
factory: f.factory
sequence: sequencer
traits: traits
is: (name) -> ~@traits.indexOf(name)
trait: (names...) ->
for name in @traits
return name if ~names.indexOf(name)
sample: (values...) ->
values[Math.floor(Math.random() * values.length)]
r = obj.factory args...
f.sequences = obj.sequences
obj = null
r
createList: (amount, args...) ->
@create(args...) for i in [1..amount]
resetFactories: ->
@factories = []
Factory
)