sixty-north / cosmic-ray

Mutation testing for Python
MIT License
565 stars 57 forks source link

More detailed diff information #299

Open rob-smallshire opened 6 years ago

rob-smallshire commented 6 years ago

I'm using cosmic-ray on an program (an assembler) which contains large dictionaries of constants defined in a single statement. When cr-report displays the diffs it can be very difficult to spot the difference. Here's an example – can you tell which opcode cosmic-ray has mutated?

-OPCODES = frozendict({ABX: {INH: 58}, ADCA: {IMM: 137, DIR: 153, IDX: 169, EXT: 185}, ADCB: {IMM: 201, DIR: 217, IDX: 233, EXT: 249}, ADDA: {IMM: 139, DIR: 155, IDX: 171, EXT: 187}, ADDB: {IMM: 203, DIR: 219, IDX: 235, EXT: 251}, ADDD: {IMM: 195, DIR: 211, IDX: 227, EXT: 243}, ANDA: {IMM: 132, DIR: 148, IDX: 164, EXT: 180}, ANDB: {IMM: 196, DIR: 212, IDX: 228, EXT: 244}, ANDCC: {IMM: 28}, ASLA: {INH: 72}, ASLB: {INH: 88}, ASL: {DIR: 8, IDX: 104, EXT: 120}, ASRA: {INH: 71}, ASRB: {INH: 87}, ASR: {DIR: 7, IDX: 103, EXT: 119}, BITA: {IMM: 133, DIR: 149, IDX: 165, EXT: 181}, BITB: {IMM: 197, DIR: 213, IDX: 229, EXT: 245}, BHS: {REL8: 36}, BLO: {REL8: 37}, BNE: {REL8: 38}, BPL: {REL8: 42}, BRA: {REL8: 32}, CLRA: {INH: 79}, CLRB: {INH: 95}, CLR: {DIR: 15, IDX: 111, EXT: 127}, CMPA: {IMM: 129, DIR: 145, IDX: 161, EXT: 177}, CMPB: {IMM: 193, DIR: 209, IDX: 225, EXT: 241}, CMPD: {IMM: 4227, DIR: 4243, IDX: 4259, EXT: 4275}, CMPS: {IMM: 4492, DIR: 4508, IDX: 4524, EXT: 4540}, CMPU: {IMM: 4483, DIR: 4499, IDX: 4515, EXT: 4531}, CMPX: {IMM: 140, DIR: 156, IDX: 172, EXT: 188}, CMPY: {IMM: 4236, DIR: 4252, IDX: 4268, EXT: 4284}, COMA: {INH: 67}, COMB: {INH: 83}, COM: {DIR: 3, IDX: 99, EXT: 115}, CWAI: {IMM: 60}, DAA: {INH: 25}, DECA: {INH: 74}, DECB: {INH: 90}, DEC: {DIR: 10, IDX: 106, EXT: 122}, EORA: {IMM: 136, DIR: 152, IDX: 168, EXT: 184}, EORB: {IMM: 200, DIR: 216, IDX: 232, EXT: 248}, EXG: {IMM: 30}, INCA: {INH: 76}, INCB: {INH: 92}, INC: {DIR: 12, IDX: 108, EXT: 124}, JMP: {DIR: 14, IDX: 110, EXT: 126}, JSR: {DIR: 157, IDX: 173, EXT: 189}, LBRA: {REL16: 22}, LBNE: {REL16: 4134}, LDA: {IMM: 134, DIR: 150, IDX: 166, EXT: 182}, LDB: {IMM: 198, DIR: 214, IDX: 230, EXT: 246}, LDD: {IMM: 204, DIR: 220, IDX: 236, EXT: 252}, LDS: {IMM: 4302, DIR: 4318, IDX: 4334, EXT: 4350}, LDU: {IMM: 206, DIR: 222, IDX: 238, EXT: 254}, LDX: {IMM: 142, DIR: 158, IDX: 174, EXT: 190}, LDY: {IMM: 4238, DIR: 4254, IDX: 4270, EXT: 4286}, LEAS: {IDX: 50}, LEAU: {IDX: 51}, LEAX: {IDX: 48}, LEAY: {IDX: 49}, LSLA: {INH: 72}, LSLB: {INH: 88}, LSL: {DIR: 8, IDX: 104, EXT: 120}, LSRA: {INH: 68}, LSRB: {INH: 84}, LSR: {DIR: 4, IDX: 100, EXT: 116}, MUL: {INH: 61}, NEGA: {INH: 64}, NEGB: {INH: 80}, NEG: {DIR: 0, IDX: 96, EXT: 112}, NOP: {INH: 18}, ORA: {IMM: 138, DIR: 154, IDX: 170, EXT: 186}, ORB: {IMM: 202, DIR: 218, IDX: 234, EXT: 250}, ORCC: {IMM: 26}, PSHS: {IMM: 52}, PSHU: {IMM: 54}, PULS: {IMM: 53}, PULU: {IMM: 55}, ROLA: {INH: 73}, ROLB: {INH: 89}, ROL: {DIR: 9, IDX: 105, EXT: 121}, RORA: {INH: 70}, RORB: {INH: 86}, ROR: {DIR: 6, IDX: 102, EXT: 118}, RTI: {INH: 59}, RTS: {INH: 57}, SBCA: {IMM: 130, DIR: 146, IDX: 162, EXT: 178}, SBCB: {IMM: 194, DIR: 210, IDX: 226, EXT: 242}, SEX: {INH: 29}, STA: {DIR: 151, IDX: 167, EXT: 183}, STB: {DIR: 215, IDX: 231, EXT: 247}, STD: {DIR: 221, IDX: 237, EXT: 253}, STS: {DIR: 4319, IDX: 4335, EXT: 4351}, STU: {DIR: 223, IDX: 239, EXT: 255}, STX: {DIR: 159, IDX: 175, EXT: 191}, STY: {DIR: 4255, IDX: 4271, EXT: 4287}, SUBA: {IMM: 128, DIR: 144, IDX: 160, EXT: 176}, SUBB: {IMM: 192, DIR: 208, IDX: 224, EXT: 240}, SUBD: {IMM: 131, DIR: 147, IDX: 163, EXT: 179}, SWI: {INH: 63}, SWI2: {INH: 4159}, SWI3: {INH: 4415}, SYNC: {INH: 19}, TFR: {IMM: 31}, TSTA: {INH: 77}, TSTB: {INH: 93}, TST: {DIR: 13, IDX: 109, EXT: 125}})
+OPCODES = frozendict({ABX: {INH: 58}, ADCA: {IMM: 137, DIR: 153, IDX: 169, EXT: 185}, ADCB: {IMM: 201, DIR: 217, IDX: 233, EXT: 249}, ADDA: {IMM: 139, DIR: 155, IDX: 171, EXT: 187}, ADDB: {IMM: 203, DIR: 219, IDX: 235, EXT: 251}, ADDD: {IMM: 195, DIR: 211, IDX: 227, EXT: 243}, ANDA: {IMM: 132, DIR: 148, IDX: 164, EXT: 180}, ANDB: {IMM: 196, DIR: 212, IDX: 228, EXT: 244}, ANDCC: {IMM: 28}, ASLA: {INH: 72}, ASLB: {INH: 88}, ASL: {DIR: 8, IDX: 104, EXT: 120}, ASRA: {INH: 71}, ASRB: {INH: 87}, ASR: {DIR: 7, IDX: 103, EXT: 119}, BITA: {IMM: 133, DIR: 149, IDX: 165, EXT: 181}, BITB: {IMM: 197, DIR: 213, IDX: 229, EXT: 245}, BHS: {REL8: 36}, BLO: {REL8: 37}, BNE: {REL8: 38}, BPL: {REL8: 42}, BRA: {REL8: 32}, CLRA: {INH: 79}, CLRB: {INH: 95}, CLR: {DIR: 15, IDX: 111, EXT: 127}, CMPA: {IMM: 129, DIR: 145, IDX: 161, EXT: 177}, CMPB: {IMM: 193, DIR: 209, IDX: 225, EXT: 241}, CMPD: {IMM: 4227, DIR: 4243, IDX: 4259, EXT: 4275}, CMPS: {IMM: 4492, DIR: 4508, IDX: 4524, EXT: 4540}, CMPU: {IMM: 4483, DIR: 4499, IDX: 4515, EXT: 4531}, CMPX: {IMM: 140, DIR: 156, IDX: 172, EXT: 188}, CMPY: {IMM: 4236, DIR: 4252, IDX: 4268, EXT: 4284}, COMA: {INH: 67}, COMB: {INH: 83}, COM: {DIR: 3, IDX: 99, EXT: 115}, CWAI: {IMM: 60}, DAA: {INH: 25}, DECA: {INH: 74}, DECB: {INH: 90}, DEC: {DIR: 10, IDX: 106, EXT: 122}, EORA: {IMM: 136, DIR: 152, IDX: 168, EXT: 184}, EORB: {IMM: 200, DIR: 216, IDX: 232, EXT: 248}, EXG: {IMM: 30}, INCA: {INH: 76}, INCB: {INH: 92}, INC: {DIR: 12, IDX: 108, EXT: 124}, JMP: {DIR: 14, IDX: 110, EXT: 126}, JSR: {DIR: 157, IDX: 173, EXT: 189}, LBRA: {REL16: 22}, LBNE: {REL16: 4134}, LDA: {IMM: 134, DIR: 150, IDX: 166, EXT: 182}, LDB: {IMM: 198, DIR: 214, IDX: 230, EXT: 246}, LDD: {IMM: 204, DIR: 220, IDX: 236, EXT: 252}, LDS: {IMM: 4302, DIR: 4318, IDX: 4334, EXT: 4350}, LDU: {IMM: 206, DIR: 222, IDX: 238, EXT: 254}, LDX: {IMM: 142, DIR: 158, IDX: 174, EXT: 190}, LDY: {IMM: 4238, DIR: 4254, IDX: 4270, EXT: 4286}, LEAS: {IDX: 50}, LEAU: {IDX: 51}, LEAX: {IDX: 48}, LEAY: {IDX: 49}, LSLA: {INH: 72}, LSLB: {INH: 88}, LSL: {DIR: 8, IDX: 104, EXT: 120}, LSRA: {INH: 68}, LSRB: {INH: 84}, LSR: {DIR: 4, IDX: 100, EXT: 116}, MUL: {INH: 61}, NEGA: {INH: 64}, NEGB: {INH: 80}, NEG: {DIR: 0, IDX: 96, EXT: 112}, NOP: {INH: 18}, ORA: {IMM: 138, DIR: 154, IDX: 170, EXT: 186}, ORB: {IMM: 202, DIR: 218, IDX: 234, EXT: 250}, ORCC: {IMM: 26}, PSHS: {IMM: 52}, PSHU: {IMM: 54}, PULS: {IMM: 53}, PULU: {IMM: 55}, ROLA: {INH: 73}, ROLB: {INH: 89}, ROL: {DIR: 9, IDX: 105, EXT: 121}, RORA: {INH: 70}, RORB: {INH: 86}, ROR: {DIR: 6, IDX: 102, EXT: 118}, RTI: {INH: 59}, RTS: {INH: 57}, SBCA: {IMM: 130, DIR: 146, IDX: 162, EXT: 178}, SBCB: {IMM: 194, DIR: 210, IDX: 226, EXT: 242}, SEX: {INH: 29}, STA: {DIR: 151, IDX: 167, EXT: 183}, STB: {DIR: 215, IDX: 231, EXT: 247}, STD: {DIR: 221, IDX: 237, EXT: 253}, STS: {DIR: 4319, IDX: 4335, EXT: 4351}, STU: {DIR: 223, IDX: 239, EXT: 255}, STX: {DIR: 159, IDX: 175, EXT: 191}, STY: {DIR: 4255, IDX: 4271, EXT: 4287}, SUBA: {IMM: 128, DIR: 144, IDX: 160, EXT: 176}, SUBB: {IMM: 192, DIR: 208, IDX: 224, EXT: 240}, SUBD: {IMM: 131, DIR: 147, IDX: 163, EXT: 179}, SWI: {INH: 63}, SWI2: {INH: 4159}, SWI3: {INH: 4415}, SYNC: {INH: 19}, TFR: {IMM: 32}, TSTA: {INH: 77}, TSTB: {INH: 93}, TST: {DIR: 13, IDX: 109, EXT: 125}})

My suggestions for improvement:

abingham commented 6 years ago

One approach might be to write a dump client that reformats the diff to use character-level diffs.