git.fiddlerwoaroof.com
src/genfuns.test.js
94944213
 import * as uut from './genfuns.js';
 
 describe('matchesSpecializer', () => {
     function AThing() {};
     const an_instance = new AThing();
     
     test('works in expected cases', () => {
         expect(uut.matchesSpecializer(an_instance, AThing)).toBeTruthy();
         expect(uut.matchesSpecializer(an_instance, String)).toBeFalsy();
         expect(uut.matchesSpecializer(an_instance, Object)).toBeTruthy();
 
         expect(uut.matchesSpecializer(new String("foobar"), String)).toBeTruthy();
         expect(uut.matchesSpecializer(new String("foobar"), Object)).toBeTruthy();
 
         expect(uut.matchesSpecializer(new Number(1), Number)).toBeTruthy();
         expect(uut.matchesSpecializer(new Number(1), Object)).toBeTruthy();
         expect(uut.matchesSpecializer(new Number(1), String)).toBeFalsy();
 
         expect(uut.matchesSpecializer([], Array)).toBeTruthy();
         expect(uut.matchesSpecializer([], Object)).toBeTruthy();
         expect(uut.matchesSpecializer([], Number)).toBeFalsy();
 
         function Foo() {}
         Foo.prototype = Object.create(null);
         const inst = new Foo();
         expect(uut.matchesSpecializer(inst, Foo)).toBeTruthy();
         expect(uut.matchesSpecializer(inst, Object)).toBeFalsy();
     });
 
     test('works in for primitives', () => {
         expect(uut.matchesSpecializer(1, Number)).toBeTruthy();
         expect(uut.matchesSpecializer(1, Object)).toBeTruthy();
         expect(uut.matchesSpecializer(1, String)).toBeFalsy();
 
         expect(uut.matchesSpecializer("1", String)).toBeTruthy();
         expect(uut.matchesSpecializer("1", Object)).toBeTruthy();
         expect(uut.matchesSpecializer("1", Number)).toBeFalsy();
 
         expect(uut.matchesSpecializer(null, Number)).toBeFalsy();
         expect(uut.matchesSpecializer(null, String)).toBeFalsy();
         expect(uut.matchesSpecializer(null, Object)).toBeFalsy();
 
         expect(uut.matchesSpecializer(undefined, Number)).toBeFalsy();
         expect(uut.matchesSpecializer(undefined, String)).toBeFalsy();
         expect(uut.matchesSpecializer(undefined, Object)).toBeFalsy();
     });
 });
 
 describe('defgeneric', () => {
     test('methods get called appropriately', () => {
         expect(
             uut.defgeneric("testing1", "a", "b")
                 .primary([Object, Object], (_, __) => 1)
                 .fn(1,2)
         ).toEqual(1);
 
         expect(
             uut.defgeneric("testing1", "a", "b")
                 .primary([Number, Number], (_, __) => 1)
                 .fn(1,2)
         ).toEqual(1);
 
         expect(
             uut.defgeneric("testing1", "a", "b")
                 .primary([Number, Number], (_, __) => 2)
                 .primary([String, String], (_, __) => 1)
                 .fn("1","2")
         ).toEqual(1);
 
         let firstCounts = 0;
         expect(
             uut.defgeneric("testing1", "a", "b")
                 .primary([Number, Number], (_, __) => firstCounts += 1)
                 .primary([String, String], (_, __) => firstCounts += 1)
                 .fn("1","2")
         ).toEqual(1);
         expect(firstCounts).toEqual(1);
 
         let secondCounts = 0;
         expect(
             uut.defgeneric("testing1", "a", "b")
                 .primary([Object, Object], (_, __) => secondCounts += 1)
                 .primary([String, String], (_, __) => secondCounts += 1)
                 .fn("1","2")
         ).toEqual(1);
         expect(secondCounts).toEqual(1);
 
         let thirdCounts = 0;
         expect(
             uut.defgeneric("testing1", "a", "b")
                 .before([Object, Object], (_, __) => thirdCounts += 1)
                 .primary([String, String], (_, __) => 'hi')
                 .after([Object, String], (_, __) => thirdCounts += 1)
                 .fn("1","2")
         ).toEqual('hi');
         expect(thirdCounts).toEqual(2);
 
 
     });
 });