import { assert, expect } from 'chai';
import { describe } from 'mocha';
import { vals1to7Objs } from './helpers/vals-1-to-7-objs.js';
import { compareObjs } from './helpers/compare-objs.js';
import { LlRbTree } from '../src/index.js';
import { compare } from './helpers/compare.js';
import { vals1to7 } from './helpers/vals-1-to-7.js';


describe('new', function() {
    it('it should insert multiple nodes into the tree', 
	function() {
        {
            const tree = new LlRbTree(compareObjs);
            tree.insertMulti(vals1to7Objs);
            expect((tree.toArrayInOrder()).map(o => o.val)).to.eql([1,2,3,3,4,5,6,7]);
        }
        {
            const tree = new LlRbTree(compareObjs, false, []);
            tree.insertMulti([]);
            expect((tree.toArrayInOrder()).map(o => o.val)).to.eql([]);
        }
        {
            const tree = new LlRbTree(compareObjs, true, []);
            tree.insertMulti(vals1to7Objs);
            const vals = (tree.toArrayInOrder()).map(o => o.val);
            expect(vals).to.eql([1,2,3,3,4,5,6,7]);
        }
        {
            const tree = new LlRbTree(compareObjs, false, []);
            tree.insertMulti(vals1to7Objs);
            expect((tree.toArrayInOrder()).map(o => o.val)).to.eql([1,2,3,4,5,6,7]);
        }
        {
            const tree = new LlRbTree(compareObjs, false, undefined);
            tree.insertMulti(vals1to7Objs);
            expect((tree.toArrayInOrder()).map(o => o.val)).to.eql([1,2,3,4,5,6,7]);
        }
        {
            const tree = new LlRbTree(compare);
            tree.insertMulti(vals1to7);
            for (let i=0; i<10; i++) { tree.insert(7); }
            expect((tree.toArrayInOrder())).to.eql([
                1,
                2,
                3,3,
                4,
                5,
                6,
                7,7,7,7,7,7,7,7,7,7,7
            ]);

            for (let i=0; i<9; i++) { tree.remove(7, false); }
            expect((tree.toArrayInOrder())).to.eql([
                1,
                2,
                3,3,
                4,
                5,
                6,
                7,7
            ]);

            for (let i=0; i<2; i++) { tree.remove(3); }
            expect((tree.toArrayInOrder())).to.eql([
                1,
                2,
                // 3,3,
                4,
                5,
                6,
                7,7
            ]);
        }
    });
});
