about summary refs log blame commit diff stats
path: root/js/where/where.test.js
blob: e674ca04c1dd3b337c500387681b8321c6948e22 (plain) (tree)



















                                                                                            









































                                                      




























































                                                                                           




                                                      
const test = {
    run(name, fn) {
        try {
            fn();
            console.log(`✅ ${name}`);
        } catch (error) {
            console.error(`❌ ${name}`);
            console.error(error);
        }
    },

    assertEquals(actual, expected, message = '') {
        const actualStr = JSON.stringify(actual);
        const expectedStr = JSON.stringify(expected);
        if (actualStr !== expectedStr) {
            throw new Error(`${message}\nExpected: ${expectedStr}\nReceived: ${actualStr}`);
        }
    }
};

const testData = [
    {
        name: 'John',
        age: 30,
        hobbies: ['reading', 'music'],
        address: {
            city: 'New York',
            country: 'USA'
        },
        preferences: {
            theme: 'dark',
            notifications: { email: true, sms: false }
        }
    },
    {
        name: 'Jane',
        age: 25,
        hobbies: ['sports'],
        address: {
            city: 'London',
            country: 'UK'
        },
        preferences: {
            theme: 'light',
            notifications: { email: false, sms: true }
        }
    },
    {
        name: 'Bob',
        age: 30,
        hobbies: ['reading', 'music'],
        address: {
            city: 'New York',
            country: 'USA'
        },
        preferences: {
            theme: 'dark',
            notifications: { email: true, sms: true }
        }
    }
];

test.run('should handle empty inputs', () => {
    test.assertEquals(where([], {}), [], 'Empty array and empty object');
    test.assertEquals(where(null, {}), [], 'Null collection');
    test.assertEquals(where(undefined, {}), [], 'Undefined collection');
    test.assertEquals(where(testData, null), [], 'Null properties');
});

test.run('should match simple properties', () => {
    const result = where(testData, { age: 30 });
    test.assertEquals(result.length, 2, 'Should find two 30-year-olds');
    test.assertEquals(
        result.map(p => p.name),
        ['John', 'Bob'],
        'Should find John and Bob'
    );
});

test.run('should match nested objects', () => {
    const result = where(testData, {
        address: { city: 'New York', country: 'USA' }
    });
    test.assertEquals(result.length, 2, 'Should find two New Yorkers');
});

test.run('should match arrays exactly', () => {
    const result = where(testData, {
        hobbies: ['reading', 'music']
    });
    test.assertEquals(result.length, 2, 'Should find two people with exact hobbies match');
});

test.run('should match deeply nested properties', () => {
    const result = where(testData, {
        preferences: { notifications: { email: true } }
    });
    test.assertEquals(result.length, 2, 'Should find two people with email notifications');
});

test.run('should handle multiple criteria', () => {
    const result = where(testData, {
        age: 30,
        'preferences.theme': 'dark',
        'address.city': 'New York'
    });
    test.assertEquals(result.length, 2, 'Should find people matching all criteria');
});

test.run('should return empty array for non-matching criteria', () => {
    const result = where(testData, {
        age: 99
    });
    test.assertEquals(result, [], 'Should return empty array for non-matching criteria');
});

test.run('should handle null values correctly', () => {
    const dataWithNull = [...testData, { name: 'Alice', age: null }];
    const result = where(dataWithNull, { age: null });
    test.assertEquals(result.length, 1, 'Should find one person with null age');
    test.assertEquals(result[0].name, 'Alice', 'Should find Alice');
});

if (typeof module !== 'undefined' && module.exports) {
    module.exports = { test };
}

process.stdout.setEncoding('utf8');