import { legacy_lexer, legacy_splitSql, legacy_cleanSql } from '../../src/utils';
import { Legacy_TokenType } from '../../src/utils/token';

describe('utils', () => {
    test('split single sql', () => {
        const sql = 'select id,name from user';
        const result = legacy_splitSql(sql);
        expect(result.length).toEqual(1);
    });

    test('split multiple sql', () => {
        const sql = `-- a ;
        select * from a;
        /* 
            xxx
            xxx
        */
        select user from b`;
        const result = legacy_splitSql(sql);
        expect(result.length).toEqual(2);
    });

    test('split special quotation sql', () => {
        const sql = `select regexp_replace('a', 'bc', 'xfe'feefe', '233'); 
            select regexp_replace('abc', "fe", '233');`;
        const result = legacy_splitSql(sql);
        expect(result.length).toEqual(2);
    });

    // test nested bracket
    test('split nested bracket sql', () => {
        const sql = `WITH cte_sales_amounts (staff, sales, year) 
        AS 
        (
            SELECT    
                first_name + ' ' + last_name, 
                SUM(quantity * list_price * (1 - discount)),
                YEAR(order_date)
            FROM    
                sales.orders o
            INNER JOIN sales.order_items i ON i.order_id = o.order_id
            INNER JOIN sales.staffs s ON s.staff_id = o.staff_id
        )
        SELECT staff, sales
        FROM cte_sales_amounts
        WHERE year = 2018;
        SELECT * FROM table;`;
        const result = legacy_splitSql(sql);
        expect(result.length).toEqual(2);
    });

    test('lexer', () => {
        const sql = `-- a ;
        select * from a;
        /* 
            xxx
            xxx
        */
        select user from b;`;
        const result = legacy_lexer(sql);
        expect(result.length).toEqual(4);
    });
    test('lexer for comments', () => {
        const sql = `select * from a;--comments`;
        const expected = `--comments`;
        const result = legacy_lexer(sql);
        const comments = result.find((token) => token.type === Legacy_TokenType.Comment);
        expect(comments?.value).toEqual(expected);
    });
    test('cleanSql', () => {
        const sql = `-- a ;
        select * from a;
        /* 
            xxx
            xxx
        */
        select user from b`;
        const result = legacy_cleanSql(sql);
        expect(result.indexOf('xxx')).toEqual(-1);
    });

    test('clean SQL white spaces', () => {
        const sql = `   
        select * from a;    `;
        const expected = 'select * from a;';
        const result = legacy_cleanSql(sql);
        expect(result).toEqual(expected);
    });
});
