art-standard-lib
Version:
The Standard Library for JavaScript that aught to be.
338 lines (280 loc) • 12.8 kB
text/coffeescript
{
inspect
isArray
isString
isDate
isFunction
isPlainObject
isPlainArray
isClass
isObject
objectName
isBrowserObject
present
Promise
isPromise
hasKeys
hasOwnKeys
hasProperties
hasOwnProperties
isArrayIterable
getSuper
Map
isArguments
log
gt, lt, gte, lte
getSuperclass
} = Neptune.Art.StandardLib
{BaseClass} = require 'art-class-system'
module.exports = suite:
hasProperties: ->
foo = new class Foo
baz: 123
bar = new Foo
bar.bud = 444
test "hasProperties null", -> assert.eq false, hasProperties null
test "hasProperties {}", -> assert.eq false, hasProperties {}
test "hasProperties []", -> assert.eq false, hasProperties []
test "hasProperties class instance with no properties", -> assert.eq true, hasProperties foo
test "hasProperties class instance with properties", -> assert.eq true, hasProperties bar
test "hasOwnProperties null", -> assert.eq false, hasOwnProperties null
test "hasOwnProperties {}", -> assert.eq false, hasOwnProperties {}
test "hasOwnProperties []", -> assert.eq false, hasOwnProperties []
test "hasOwnProperties class instance with no properties", -> assert.eq false, hasOwnProperties foo
test "hasOwnProperties class instance with properties", -> assert.eq true, hasOwnProperties bar
isPromise: ->
test "isPromise Promise.resolve()", -> assert.eq true, isPromise Promise.resolve()
test "isPromise Promise.reject()", -> (assert.eq true, isPromise p = Promise.reject()); p.catch ->
test "isPromise 1 is false", -> assert.eq false, isPromise 1
test "isPromise '' is false", -> assert.eq false, isPromise ''
test "isPromise {} is false", -> assert.eq false, isPromise {}
test "isPromise Promise is false", -> assert.eq false, isPromise Promise
isArrayIterable: ->
test "isArrayIterable [] is true", -> assert.eq true, isArrayIterable []
test "isArrayIterable Int8Array is true", -> assert.eq true, isArrayIterable new Int8Array(4)
test "isArrayIterable arguments is true", -> assert.eq true, isArrayIterable arguments
test "isArrayIterable string is true", ->
assert.eq true, isArrayIterable "hi"
assert.eq true, isArrayIterable ''
test "isArrayIterable {length: 10} is true", -> assert.eq true, isArrayIterable length: 10
test "isArrayIterable - non arrays are false", ->
assert.eq false, isArrayIterable()
assert.eq false, isArrayIterable null
assert.eq false, isArrayIterable undefined
assert.eq false, isArrayIterable {}
assert.eq false, isArrayIterable 123
isString: ->
test "isString 'foo' is true", ->
assert.eq true, isString "foo"
assert.eq true, isString ''
test "isString - non strings are false", ->
assert.eq false, isString()
assert.eq false, isString null
assert.eq false, isString undefined
assert.eq false, isString 123
assert.eq false, isString {}
assert.eq false, isString []
assert.eq false, isString ->
isPlainArray: ->
test "isPlainArray is isArray", -> assert.eq isPlainArray, isArray
test "isPlainArray []", -> assert.eq true, isPlainArray []
test "isPlainArray - false values", ->
assert.eq false, isPlainArray {}
assert.eq false, isPlainArray 123
assert.eq false, isPlainArray ""
assert.eq false, isPlainArray "abc"
assert.eq false, isPlainArray new Int8Array 4
assert.eq false, isPlainArray false
assert.eq false, isPlainArray null
assert.eq false, isPlainArray undefined
isFunction: ->
test "isFunction(->) is true", -> assert.eq true, isFunction(->)
test "isFunction(class Foo) is true", -> assert.eq true, isFunction(class Foo)
test "isFunction - non functions are false", ->
assert.eq false, isFunction()
assert.eq false, isFunction null
assert.eq false, isFunction ''
assert.eq false, isFunction undefined
assert.eq false, isFunction 123
assert.eq false, isFunction {}
assert.eq false, isFunction []
assert.eq false, isFunction "foo"
isDate: ->
test "isDate new Date is true", -> assert.eq true, isDate new Date
test "isDate '' is false", -> assert.eq false, isDate ""
test "isDate '07-04-2018' is false", -> assert.eq false, isDate "07-04-2018"
isPlainObject: ->
test "isPlainObject {} is true", -> assert.eq true, isPlainObject {}
test "isPlainObject(new class Foo) is false", -> assert.eq false, isPlainObject new class Foo
test "isPlainObject - non plain objects are false", ->
assert.eq false, isPlainObject()
assert.eq false, isPlainObject null
assert.eq false, isPlainObject undefined
assert.eq false, isPlainObject 123
assert.eq false, isPlainObject "foo"
assert.eq false, isPlainObject ""
assert.eq false, isPlainObject []
assert.eq false, isPlainObject ->
isArguments: ->
test "actual args", ->
assert.eq true, isArguments (-> arguments)()
test "just array", ->
assert.eq false, isArguments []
test "quacks-like-a-duck-args", ->
assert.eq false, isArguments length: 0, callee: ->
test "null", ->
assert.eq false, isArguments null
test "1", ->
assert.eq false, isArguments 1
isClass: ->
test "isClass empty-class is false - only class we can't detect correctly", ->
assert.eq false, isClass class Foo
test "isClass function is false", ->
assert.eq false, isClass ->
assert.eq false, isClass (a) ->
assert.eq false, isClass (a, b) ->
test "isClass class-contains-class-property is true", ->
assert.eq true, isClass class Foo
@bar: 0
test "isClass class-contains-prototype-property is true", ->
assert.eq true, isClass class Foo
bar: 0
test "isClass empty-class derived class is true", ->
class Foo
assert.eq true, isClass class Bar extends Foo
test "isClass non-empty-class derived class is true", ->
class Foo
baz: 0
assert.eq true, isClass class Bar extends Foo
test "isClass - non class objects are false", ->
assert.eq false, isClass()
assert.eq false, isClass null
assert.eq false, isClass undefined
assert.eq false, isClass 123
assert.eq false, isClass "foo"
assert.eq false, isClass []
assert.eq false, isClass {}
assert.eq false, isClass ->
isObject: ->
test "isObject {} is true", -> assert.eq true, isObject {}
test "isObject new class Foo is true", -> assert.eq true, isObject new class Foo
test "isObject class Foo is false", -> assert.eq false, isObject class Foo
test "isObject [] is false", -> assert.eq false, isObject []
test "isObject null is false", -> assert.eq false, isObject null
test "isObject -> is false", -> assert.eq false, isObject ->
test "isObject - non objects are false", ->
assert.eq false, isObject()
assert.eq false, isObject undefined
assert.eq false, isObject 123
assert.eq false, isObject ''
assert.eq false, isObject "foo"
objectName: ->
test "objectName new Class Foo == 'Foo'", ->
class Foo
assert.eq "Foo", objectName new Foo
test "objectName Class Foo = 'Foo'", ->
class Foo
assert.eq "Foo", objectName Foo
test "objectName -> == 'function'", ->
assert.eq 'function', objectName ->
test "objectName {} == 'Object'", ->
assert.eq 'Object', objectName {}
test "objectName 123 == 'Number'", ->
assert.eq 'Number', objectName 123
test "objectName 'foo' == '123'", ->
assert.eq 'String', objectName 'foo'
test "objectName null == 'null'", ->
assert.eq 'null', objectName null
test "objectName undefined == 'undefined'", ->
assert.eq 'undefined', objectName undefined
present: ->
test "present strings", ->
assert.eq false, present ''
assert.eq false, present ' \t \n \n'
assert.eq ' j', present ' j'
assert.eq "j\n", present "j\n"
assert.eq 'jh', present 'jh'
test "present null, undefined", ->
assert.eq true, present true
assert.eq false, present null
assert.eq false, present undefined
test "present 0 is true", ->
assert.eq true, present 0
test "present false is false", ->
assert.eq false, present false
test "present numbers", ->
assert.eq 0.5, present 0.5
assert.eq 1, present 1
assert.eq -1, present -1
test "present custom", ->
o1 = present: -> true
o2 = present: -> false
assert.eq o1, present o1
assert.eq false, present o2
test "returnIfNotPresent value", ->
assert.eq "hi", present undefined, "hi"
assert.eq "hi", present null, "hi"
assert.eq true, present 0, "hi"
assert.eq "hi", present false, "hi"
assert.eq "hi", present "", "hi"
inequality: ->
testInequality = (a, b) ->
test "#{a}.gt/lt/gte/lte #{b}", ->
assert.eq gt(a, b), a > b, "gt"
assert.eq lt(a, b), a < b, "lt"
assert.eq gte(a, b), a >= b, "gte"
assert.eq lte(a, b), a <= b, "lte"
testInequality 1, 0
testInequality 0, 1
testInequality 0, 0
testInequality 1, 1
testInequality 1, 2
testInequality 2, 1
testInequality "hi", "hi"
testInequality "hi1", "hi2"
testInequality "hi2", "hi1"
getSuperclass: ->
class MyCoffeeScriptNotExtendClass
mySpecialProtoProp: 123
class MyCoffeeScriptExtendedClass extends Object
mySpecialProtoProp: 123
class MySubCoffeeScriptExtendedClass extends MyCoffeeScriptExtendedClass
mySpecialProtoProp: 123
class MyBaseClassCoffeeScriptExtendedClass extends BaseClass
mySpecialProtoProp: 123
try
MyEs6NotExtendedClass = eval "(function(){class MyEs6NotExtendedClass {};return MyEs6NotExtendedClass;})()"
global.MyEs6ExtendedClass = eval "(function(){class MyEs6ExtendedClass extends Object {};return MyEs6ExtendedClass;})()"
MySubEs6ExtendedClass = eval "(function(){class MySubEs6ExtendedClass extends global.MyEs6ExtendedClass {};return MySubEs6ExtendedClass;})()"
MyBaseClassEs6ExtendedClass = eval "(function(){class MyBaseClassEs6ExtendedClass extends Neptune.Art.ClassSystem.BaseClass {};return MyBaseClassEs6ExtendedClass;})()"
test "CoffeeScript not extended", -> assert.notPresent getSuperclass MyCoffeeScriptNotExtendClass
test "CoffeeScript extend Object", -> assert.equal Object, getSuperclass MyCoffeeScriptExtendedClass
test "CoffeeScript extend Foo extend Object", -> assert.equal MyCoffeeScriptExtendedClass, getSuperclass MySubCoffeeScriptExtendedClass
test "CoffeeScript extend BaseClass", -> assert.equal BaseClass, getSuperclass MyBaseClassCoffeeScriptExtendedClass
test "Es6 not extended", -> assert.notPresent getSuperclass MyEs6NotExtendedClass
test "Es6 extended Object", -> assert.equal Object, getSuperclass MyEs6ExtendedClass
test "Es6 extend Foo extend Object", -> assert.equal MyEs6ExtendedClass, getSuperclass MySubEs6ExtendedClass
test "Es6 extend BaseClass", -> assert.equal BaseClass, getSuperclass MyBaseClassEs6ExtendedClass
test "null", -> assert.notPresent getSuperclass null
test "undefined", -> assert.notPresent getSuperclass undefined
test "->", -> assert.notPresent getSuperclass ->
test "{}", -> assert.notPresent getSuperclass {}
getSuper: ->
class MyExtendedClass extends BaseClass
mySpecialProtoProp: 123
myExtendedInstance = new MyExtendedClass
try
MyEs6ExtendedClass = eval "(function(){class MyEs6ExtendedClass extends Neptune.Art.ClassSystem.BaseClass {};return MyEs6ExtendedClass;})()"
test "{}", -> assert.eq null, getSuper {}
test "[]", -> assert.eq {}, getSuper []
test "->", -> assert.eq Function.__proto__, getSuper ->
MyEs6ExtendedClass && test "MyEs6ExtendedClass -> BaseClass", ->
# evaluating in a funciton so that IE11 doesn't choke
# only works with ES6 classes - which will be available in CoffeeScript 2 and CaffeineScript
assert.eq BaseClass, getSuper MyEs6ExtendedClass
MyEs6ExtendedClass && test "myExtendedInstance -> BaseClass.prototype", ->
assert.eq Object.getPrototypeOf(myExtendedInstance), MyExtendedClass.prototype
assert.eq Object.getPrototypeOf(Object.getPrototypeOf(myExtendedInstance)), Neptune.Art.ClassSystem.BaseClass.prototype
assert.eq getSuper(myExtendedInstance), BaseClass.prototype
# assert.instanceof BaseClass, getSuper myExtendedInstance
# assert.eq MyExtendedClass.prototype, getSuper myExtendedInstance