import { getThrusterSignal, findAllSignals, getFeedbackSignal, findFeedbackSignals } from '../src/day7';
import { input } from './data/day7.data';

describe('day 7 tests', () => {
    describe('part 1', () => {
        it('should get a thruster signal from 43210', () => {
            let memory = '3,15,3,16,1002,16,10,16,1,16,15,15,4,15,99,0,0'.split(',').map(c => parseInt(c,10));
            let setting = [4,3,2,1,0];
            expect(getThrusterSignal(memory, setting).output).toEqual([43210]);
        });

        it('should get a thruster signal from 54321', () => {
            let memory = '3,23,3,24,1002,24,10,24,1002,23,-1,23,101,5,23,23,1,24,23,23,4,23,99,0,0'.split(',').map(c => parseInt(c,10));
            let setting = [0,1,2,3,4];
            expect(getThrusterSignal(memory, setting).output).toEqual([54321]);
        });

        it('should get a thruster signal from 65210', () => {
            let memory = '3,31,3,32,1002,32,10,32,1001,31,-2,31,1007,31,0,33,1002,33,7,33,1,33,31,31,1,32,31,31,4,31,99,0,0,0'.split(',').map(c => parseInt(c,10));
            let setting = [1,0,4,3,2];
            expect(getThrusterSignal(memory, setting).output).toEqual([65210]);
        });

        it('should find all signals with the max of 43210', () => {
            let memory = '3,15,3,16,1002,16,10,16,1,16,15,15,4,15,99,0,0'.split(',').map(c => parseInt(c,10));
            let allOutputs = findAllSignals(memory);
            expect(allOutputs['43210']).toEqual(43210);
            expect(allOutputs['12304']).toEqual(12304);
            expect(allOutputs['02431']).toEqual(2431);
        });

        it('should find all signals with the max of 43210', () => {
            let memory = '3,23,3,24,1002,24,10,24,1002,23,-1,23,101,5,23,23,1,24,23,23,4,23,99,0,0'.split(',').map(c => parseInt(c,10));
            let allOutputs = findAllSignals(memory);
            expect(allOutputs['01234']).toEqual(54321);
        });

        it('should find all signals with the max of 43210', () => {
            let memory = '3,31,3,32,1002,32,10,32,1001,31,-2,31,1007,31,0,33,1002,33,7,33,1,33,31,31,1,32,31,31,4,31,99,0,0,0'.split(',').map(c => parseInt(c,10));
            let allOutputs = findAllSignals(memory);
            expect(allOutputs['10432']).toEqual(65210);
        });

        it('should solve', () => {
            let allOutputs = findAllSignals(input);
            let maxVal = Object.keys(allOutputs).reduce((acc, cur) => {
                if (allOutputs[cur] > acc) {
                    acc = allOutputs[cur];
                }
                return acc;
            }, -1);
            expect(maxVal).toEqual(101490);
        });
    });

    describe('part 2', () => {
        it('should get a feedback signal from 98765', () => {
            let memory = '3,26,1001,26,-4,26,3,27,1002,27,2,27,1,27,26,27,4,27,1001,28,-1,28,1005,28,6,99,0,0,5'.split(',').map(c => parseInt(c,10));
            let setting = [9,8,7,6,5];
            expect(getFeedbackSignal(memory, setting).output).toEqual([139629729]);
        });

        it('should get a feedback signal from 97856', () => {
            let memory = '3,52,1001,52,-5,52,3,53,1,52,56,54,1007,54,5,55,1005,55,26,1001,54,-5,54,1105,1,12,1,53,54,53,1008,54,0,55,1001,55,1,55,2,53,55,53,4,53,1001,56,-1,56,1005,56,6,99,0,0,0,0,10'.split(',').map(c => parseInt(c,10));
            let setting = [9,7,8,5,6];
            expect(getFeedbackSignal(memory, setting).output).toEqual([18216]);
        });

        it('should find feedback signals with the max of 98765', () => {
            let memory = '3,26,1001,26,-4,26,3,27,1002,27,2,27,1,27,26,27,4,27,1001,28,-1,28,1005,28,6,99,0,0,5'.split(',').map(c => parseInt(c,10));
            let allOutputs = findFeedbackSignals(memory);
            expect(allOutputs['98765']).toEqual(139629729);
        });

        it('should find feedback signals with the max of 97856', () => {
            let memory = '3,52,1001,52,-5,52,3,53,1,52,56,54,1007,54,5,55,1005,55,26,1001,54,-5,54,1105,1,12,1,53,54,53,1008,54,0,55,1001,55,1,55,2,53,55,53,4,53,1001,56,-1,56,1005,56,6,99,0,0,0,0,10'.split(',').map(c => parseInt(c,10));
            let allOutputs = findFeedbackSignals(memory);
            expect(allOutputs['97856']).toEqual(18216);
        });

        it('should solve', () => {
            let allOutputs = findFeedbackSignals(input);
            let maxVal = Object.keys(allOutputs).reduce((acc, cur) => {
                if (allOutputs[cur] > acc) {
                    acc = allOutputs[cur];
                }
                return acc;
            }, -1);
            expect(maxVal).toEqual(61019896);
        });
    });
});
