test 'a\nc\n\n\n\n' 'a\nb\n\n\n' test 'a\nb\nc\n' 'a\nc\n' test '' '' test 'a\nb\nc' 'a\nb\nc' test 'a\nb\nc\nd\n' 'a\nd\n' test 'a\nb\nc\nd\n' 'a\nc\ne\n' test 'a\nb\nc\n' 'a\nc\n' test 'a\n' 'c\na\nb\n' test 'a\n' '' test 'a\n' 'b\nc\n' test 'a\n' 'c\na\n' test '' 'adjfkjdjksdhfksj' test '' 'ab' test '' 'abc' test 'a' 'a' test 'ab' 'ab' test 'abc' 'abc' test 'a\n' 'a\n' test 'a\nb' 'a\nb' showdiff( 'x\n\nx\n\nx\n\nx\n\nz\n', 'x\n\nx\n\ny\n\nx\n\nx\n\nz\n'): 'x\n\nx\n\n' 6 6 '' -> 'y\n\n' 'x\n\nx\n\nz\n' showdiff( 'x\n\nx\n\nx\n\nx\n\nz\n', 'x\n\nx\n\ny\n\nx\n\ny\n\nx\n\nz\n'): 'x\n\nx\n\n' 6 6 '' -> 'y\n\n' 'x\n\n' 9 9 '' -> 'y\n\n' 'x\n\nz\n' showdiff( 'a\nb\nb\nb\nc\n.\nd\ne\n.\nf\n', 'a\nb\nb\na\nb\nb\nb\nc\n.\nb\nc\n.\nd\ne\nf\n'): 0 0 '' -> 'a\nb\nb\n' 'a\nb\nb\nb\nc\n.\n' 12 12 '' -> 'b\nc\n.\n' 'd\ne\n' 16 18 '.\n' -> '' 'f\n' done done Nice diff for a trivial change: showdiff( '<0\n-\n<1\n-\n<2\n-\n<3\n-\n<4\n-\n', '>0\n-\n>1\n-\n>2\n-\n>3\n-\n>4\n-\n'): 0 3 '<0\n' -> '>0\n' '-\n' 5 8 '<1\n' -> '>1\n' '-\n' 10 13 '<2\n' -> '>2\n' '-\n' 15 18 '<3\n' -> '>3\n' '-\n' 20 23 '<4\n' -> '>4\n' '-\n' Diff 1 to 3 lines - preference for appending: showdiff( 'a\n', 'a\na\na\n'): 'a\n' 2 2 '' -> 'a\na\n' Diff 1 to 5 lines - preference for appending: showdiff( 'a\n', 'a\na\na\na\na\n'): 'a\n' 2 2 '' -> 'a\na\na\na\n' Diff 3 to 1 lines - preference for removing trailing lines: showdiff( 'a\na\na\n', 'a\n'): 'a\n' 2 6 'a\na\n' -> '' Diff 5 to 1 lines - preference for removing trailing lines: showdiff( 'a\na\na\na\na\n', 'a\n'): 'a\n' 2 10 'a\na\na\na\n' -> ''