describe("SEARCH", ()=>{
    const UnitTest = require("./lib/UnitTest");
    const Z80Tester = require('./lib/Z80Tester');
    const Z80 = require('../Z80/Z80');
    const cpu = new Z80();

    const tester = new Z80Tester();
    function report(cpu, name, result) {
        if(result === true) {
            UnitTest.report(name, true);
        } else {
            UnitTest.report(name, false, "");
            cpu.reg.debugDump();
        }
    }
    var test_set = [
        { name: "CPI", test: function() {
            cpu.reg.setBC(0x0028);
            cpu.reg.setA( 0x27 );
            cpu.reg.setHL(0xD000);
            for(var i = 0; i < 0x28; i++) {
                cpu.memory.poke(0xD000 + i, i);
            }
            for(var i = 0; i < 0x28; i++) {
                tester.runMnemonics(cpu, ["CPI"]);
                report(cpu, "CPI inc HL", cpu.reg.getHL() == 0xD001 + i);
                report(cpu, "CPI dec BC", cpu.reg.getBC() == 0x0027 - i);
                report(cpu, "CPI memory", cpu.memory.peek(0xD000 + i) == i);
                report(cpu, "CPI Z flag", cpu.reg.flagZ() == (i == 0x27));
            }
        }},
        { name: "CPIR", test: function() {
            cpu.reg.setBC(0x0028);
            cpu.reg.setA( 0x27 );
            cpu.reg.setHL(0xD000);
            for(var i = 0; i < 0x28; i++) {
                cpu.memory.poke(0xD000 + i, i);
            }
            tester.runMnemonics(cpu, ["CPIR"]);
            report(cpu, "CPIR inc HL", cpu.reg.getHL() == 0xD028);
            report(cpu, "CPIR dec BC", cpu.reg.getBC() == 0x0000);
            for(var i = 0; i < 0x28; i++) {
                report(cpu, "CPIR memory", cpu.memory.peek(0xD000 + i) == i);
            }
            report(cpu, "CPIR Z flag", cpu.reg.flagZ() == true);
        }},
        { name: "CPIR 2", test: function() {
            cpu.reg.setBC(0x0028);
            cpu.reg.setA( 0x10 );
            cpu.reg.setHL(0xD000);
            for(var i = 0; i < 0x28; i++) {
                cpu.memory.poke(0xD000 + i, i);
            }
            tester.runMnemonics(cpu, ["CPIR"]);
            report(cpu, "CPIR inc HL", cpu.reg.getHL() == 0xD011);
            report(cpu, "CPIR dec BC", cpu.reg.getBC() == 0x0017);
            for(var i = 0; i < 0x28; i++) {
                report(cpu, "CPIR memory", cpu.memory.peek(0xD000 + i) == i);
            }
            report(cpu, "CPIR Z flag", cpu.reg.flagZ() == true);
        }},
        { name: "CPD", test: function() {
            cpu.reg.setBC(0x0028);
            cpu.reg.setA( 0x27 );
            cpu.reg.setHL(0xD027);
            for(var i = 0; i < 0x28; i++) {
                cpu.memory.poke(0xD027 - i, i);
            }
            for(var i = 0; i < 0x28; i++) {
                tester.runMnemonics(cpu, ["CPD"]);
                report(cpu, "CPD #" + i + " dec HL", cpu.reg.getHL() == 0xD026 - i);
                report(cpu, "CPD #" + i + " dec BC", cpu.reg.getBC() == 0x0027 - i);
                report(cpu, "CPD #" + i + " memory", cpu.memory.peek(0xD027 - i) == i);
                report(cpu, "CPD #" + i + " Z flag", cpu.reg.flagZ() == (i == 0x27));
            }
        }},
        { name: "CPDR", test: function() {
            cpu.reg.setBC(0x0028);
            cpu.reg.setA( 0x27 );
            cpu.reg.setHL(0xD027);
            for(var i = 0; i < 0x28; i++) {
                cpu.memory.poke(0xD027 - i, i);
            }
            tester.runMnemonics(cpu, ["CPDR"]);
            report(cpu, "CPDR dec HL", cpu.reg.getHL() == 0xCFFF);
            report(cpu, "CPDR dec BC", cpu.reg.getBC() == 0x0000);
            for(var i = 0; i < 0x28; i++) {
                report(cpu, "CPDR memory", cpu.memory.peek(0xD027 - i) == i);
            }
            report(cpu, "CPDR Z flag", cpu.reg.flagZ() == true);
        }},
    ];
    UnitTest.test({
        name: "search",
        test_set: test_set
    });
});
