@@ -9,9 +9,9 @@ describe "moon", ->
99 moon = require " moon"
1010
1111 describe " type" , ->
12- it " returns the class for a class" , ->
12+ it " returns ' class' for a class" , ->
1313 class Test
14- assert . equal Test , moon. type Test
14+ assert . equal " class " , moon. type Test
1515
1616 it " returns the class for an instance" , ->
1717 class Test
@@ -38,6 +38,12 @@ describe "moon", ->
3838 assert . equal " table" , moon. type {}
3939 assert . equal " table" , moon. type { hello : " world" }
4040
41+ it " returns 'class' for classes with inheritance" , ->
42+ class Parent
43+ class Child extends Parent
44+ assert . equal " class" , moon. type Parent
45+ assert . equal " class" , moon. type Child
46+
4147 it " works with inheritance" , ->
4248 class Parent
4349 class Child extends Parent
@@ -307,6 +313,60 @@ describe "moon", ->
307313 assert . falsy moon. is_instance_of A !, B
308314 assert . falsy moon. is_instance_of A !, C
309315
316+ describe " is_subclass_of" , ->
317+ it " returns true for direct child" , ->
318+ class Parent
319+ class Child extends Parent
320+ assert . truthy moon. is_subclass_of Child , Parent
321+
322+ it " returns true for deep inheritance" , ->
323+ class A
324+ class B extends A
325+ class C extends B
326+ assert . truthy moon. is_subclass_of C , A
327+ assert . truthy moon. is_subclass_of C , B
328+ assert . truthy moon. is_subclass_of B , A
329+
330+ it " returns false for same class" , ->
331+ class A
332+ assert . falsy moon. is_subclass_of A , A
333+
334+ it " returns false for parent checked against child" , ->
335+ class Parent
336+ class Child extends Parent
337+ assert . falsy moon. is_subclass_of Parent , Child
338+
339+ it " returns false for unrelated classes" , ->
340+ class A
341+ class B
342+ assert . falsy moon. is_subclass_of A , B
343+ assert . falsy moon. is_subclass_of B , A
344+
345+ it " returns false for class without parent" , ->
346+ class A
347+ class B
348+ assert . falsy moon. is_subclass_of A , B
349+
350+ it " returns false when __base is passed as the parent" , ->
351+ class Parent
352+ class Child extends Parent
353+ assert . falsy moon. is_subclass_of Child , Parent . __base
354+ assert . falsy moon. is_subclass_of Child , Child . __base
355+
356+ it " errors when first argument is not a class" , ->
357+ class Hello
358+ assert . has_error ( -> moon. is_subclass_of Hello !, Hello ) , " is_subclass_of: expected class, got table"
359+ assert . has_error ( -> moon. is_subclass_of Hello . __base, Hello ) , " is_subclass_of: expected class, got table"
360+ assert . has_error ( -> moon. is_subclass_of {} , Hello ) , " is_subclass_of: expected class, got table"
361+ assert . has_error ( -> moon. is_subclass_of nil , Hello ) , " is_subclass_of: expected class, got nil"
362+ assert . has_error ( -> moon. is_subclass_of 123 , Hello ) , " is_subclass_of: expected class, got number"
363+
364+ it " errors when __base is passed as the first argument" , ->
365+ class Parent
366+ class Child extends Parent
367+ assert . has_error ( -> moon. is_subclass_of Parent . __base, Parent ) , " is_subclass_of: expected class, got table"
368+ assert . has_error ( -> moon. is_subclass_of Child . __base, Child ) , " is_subclass_of: expected class, got table"
369+
310370 it " should fold" , ->
311371 numbers = { 4 , 3 , 5 , 6 , 7 , 2 , 3 }
312372 sum = moon. fold numbers, ( a, b) -> a + b
0 commit comments