CodingTrain / Toy-Neural-Network-JS

Neural Network JavaScript library for Coding Train tutorials
MIT License
425 stars 242 forks source link

Custom test without node using pure javascript #76

Open xxMrPHDxx opened 6 years ago

xxMrPHDxx commented 6 years ago

Hey, I just tried to create my own test function which kind of similar to the Jest library. Have been testing for 5 statements below and yet to find any failure. But for now, it only have 2 functional tests which is expect(value).toBe(other) and expect(value).toEqual(something).

Let me see what do you guys think about this kind of stuff. Is it worth it?

Below is the implementation of the tests

function check(current,other){
    if(typeof other !== 'object' && typeof current !== 'object') return current === other;
    let equal = false;
    for(let prop in other){
        if(current[prop] === undefined) throw new Error("FAILED");
        equal = equal || check(current[prop],other[prop]);
    }
    if(!equal) throw new Error("FAILED");
    return equal;
}

function test(comment,callback){
    let error;
    try{
        //execute the tests;
        callback();
    }catch(e){
        // Get the result whether it passed or failed 
        error = e.message;
    }
    console.log(comment,error === "FAILED" ? "FAILED" : "PASSED");
}

function expect(value){
    this.toBe = function(other){
        if(value !== other) throw new Error("FAILED");
    }
    this.toEqual = function(something){
        check(value,something);
    }
    return this;
}

// The tests start HERE

test('Is 2+2 be 4?',() => {
    expect(2 + 2).toBe(4);                      // returns : Is 2+2 be 4? PASSED
});

test('Is 2+3 be 4?',() => {
    expect(2 + 3).toBe(4);                      // returns : Is 2+3 be 4? FAILED
});

test('Is {value:3*3} equal {value:9}?',() => {
    expect({value:3*3}).toEqual({value:9});                 // returns : Is {value:3*3} equal {value:9}? PASSED
});

test('Is {value:2*3} equal {value:9}?',() => {
    expect({value:2*3}).toEqual({value:9});                 // returns : Is {value:2*3} equal {value:9}? FAILED
});

test('Is {value:{arr:[6]}} equal {value:9}?',() => {
    expect({value:{arr:[6]}}).toEqual({value:9});           // Is {value:{arr:[6]}} equal {value:9}? FAILED
});
Adil-Iqbal commented 6 years ago

That's pretty amazing dude. Maybe not the best direction for the toy nn library but its one heck of an achievement.

I was wondering how jest was doing what it was.

xxMrPHDxx commented 6 years ago

Well actually after looking at it for a few times, it seems that the check function missing something.

I loop into other's property and check them all but forgot to check current's property.

So if I do this

test('Is {value:9,arr:[6]} equal {value:9}?',() => {
    expect({value:9,arr:[6]}).toEqual({value:9});
});

it will be PASSED because arr property was not being checked.

This should fix it

function check(current,other){
    if(typeof other !== 'object' && typeof current !== 'object') return current === other;
    let equal = false;
    const already = [];
    for(let prop in other){
        if(current[prop] === undefined) throw new Error("FAILED");
        equal = equal || check(current[prop],other[prop]);
        already.push(prop);
    }
    for(let prop in current){
        if(already.includes(prop)) continue;
        if(other[prop] === undefined) throw new Error("FAILED");
        equal = equal || check(current[prop],other[prop]);
    }
    if(!equal) throw new Error("FAILED");
    return true;
}