git.fiddlerwoaroof.com
Raw Blame History
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);


    });
});