jsadvent/testAll.js

172 lines
3.8 KiB
JavaScript

const { execSync } = require('child_process');
const results = {
2020: {
1: [1007104, 18847752],
2: [465, 294],
3: [237, 2106818610],
4: [200, 116],
5: [801, 597],
6: [6297, 3158],
7: [177, 34988],
8: [1553, 1877],
9: [1721308972, 209694133],
10: [2277, 37024595836928],
11: [2359, 2131],
12: [508, 30761],
13: [2095, 598411311431841],
14: [13556564111697, 4173715962894],
},
2019: {
1: [3386686, 5077155],
2: [3166704, 8018],
3: [1225, 107036],
4: [2150, 1462],
5: [16434972, 16694270],
6: [154386, 346],
},
2018: {
1: [578, 82516],
2: [4980, 'qysdtrkloagnfozuwujmhrbvx'],
3: [124850, 1097],
4: [76357, 41668],
// slow
5: [11894, 5310],
6: [5626, 46554],
},
2017: {
1: [1097, 1188],
2: [41887, 226],
3: [438, 266330],
4: [383, 265],
// slow (pt2)
5: [391540, 30513679],
// todo:
// 6: [12841, 8038],
},
2016: {
1: [262, 131],
2: [24862, '46C91'],
3: [1032, 1838],
4: [278221, 267],
// very slow
5: ['2414bc77', '437e60fc'],
6: ['mshjnduc', 'apfeeebz'],
},
2015: {
1: [74, 1795],
2: [1598415, 3812909],
3: [2565, 2639],
// slow
4: [117946, 3938038],
5: [238, 69],
6: [377891, 14110788],
7: [3176, 14710],
8: [1342, 2074],
},
};
const LOG_MODE = ((LOG_MODE) => {
switch (LOG_MODE) {
case 'compact':
return 'compact';
default:
return 'verbose';
}
})(process.env.LOG_MODE || 'compact');
const RUN_SLOW = (process.env.RUN_SLOW || 'false') === 'true';
let errors = [];
const run = (year, day, problem, expected) => {
try {
switch (LOG_MODE) {
case 'compact':
break;
case 'verbose':
process.stdout.write(`${year}-${day} ${problem}: `);
break;
}
// todo: implement slow solution detection of some sort
const start = process.hrtime.bigint();
const output = execSync(
`"${process.argv[0]}" index.js ${year} ${day} ${problem}`,
);
const end = process.hrtime.bigint();
const actual = output.toString().trim();
if (actual !== `${expected}`) {
switch (LOG_MODE) {
case 'compact':
process.stdout.write('x');
errors.push(
`${year}-${day} ${problem} got ${actual}, expected ${expected}\n`,
);
break;
case 'verbose':
process.stdout.write('fail\n');
process.stdout.write(`\tgot ${actual}, expected ${expected}\n`);
break;
}
} else {
switch (LOG_MODE) {
case 'compact':
process.stdout.write('.');
break;
case 'verbose':
process.stdout.write('pass\n');
break;
}
}
} catch (e) {
process.stdout.write('x\n');
switch (LOG_MODE) {
case 'compact':
process.stdout.write('e');
errors.push(
`${year}-${day} ${problem} Error:\n${e.stderr
.toString()
.split('\n')
.map((s) => '\t' + s)
.join('\n')}`,
);
break;
case 'verbose':
process.stdout.write('error\n');
process.stdout.write(
e.stderr
.toString()
.split('\n')
.map((s) => '\t' + s)
.join('\n') + '\n',
);
break;
}
}
};
for (const [year, days] of Object.entries(results)) {
switch (LOG_MODE) {
case 'compact':
process.stdout.write(`${year}: `);
break;
case 'verbose':
break;
}
for (const [day, [one, two]] of Object.entries(days)) {
run(year, day, 1, one);
run(year, day, 2, two);
}
switch (LOG_MODE) {
case 'compact':
process.stdout.write('\n');
break;
case 'verbose':
break;
}
}
for (const error of errors) {
process.stdout.write(error);
}