Skip to content

Commit 90262b3

Browse files
committed
Make code testable, add test against native xxd
1 parent ff11c6f commit 90262b3

File tree

2 files changed

+78
-18
lines changed

2 files changed

+78
-18
lines changed

xxd.go

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,7 @@ import (
88
"unicode/utf8"
99
)
1010

11-
const (
12-
byteOffsetInit = 8
13-
charOffsetInt = 39
14-
line_length = 50
15-
)
16-
1711
func main() {
18-
line_offset := 0
19-
2012
if len(os.Args) != 2 {
2113
fmt.Fprintf(os.Stderr, "Usage: %s [file]\n", os.Args[0])
2214
os.Exit(1)
@@ -27,8 +19,21 @@ func main() {
2719
panic(err)
2820
}
2921
defer f.Close()
22+
if err := XXD(f, os.Stdout); err != nil {
23+
panic(err)
24+
}
25+
}
26+
27+
const (
28+
byteOffsetInit = 8
29+
charOffsetInt = 39
30+
line_length = 50
31+
)
32+
33+
func XXD(r io.Reader, w io.Writer) error {
34+
line_offset := 0
3035

31-
r := bufio.NewReader(f)
36+
r = bufio.NewReader(r)
3237
buf := make([]byte, 16)
3338
for {
3439
n, err := r.Read(buf)
@@ -37,41 +42,42 @@ func main() {
3742
}
3843

3944
// Line offset
40-
fmt.Printf("%06x0: ", line_offset)
45+
fmt.Fprintf(w, "%06x0: ", line_offset)
4146
line_offset++
4247

4348
// Hex values
4449
for i := 0; i < n; i++ {
45-
fmt.Printf("%02x", buf[i])
50+
fmt.Fprintf(w, "%02x", buf[i])
4651

4752
if i%2 == 1 {
48-
fmt.Print(" ")
53+
fmt.Fprint(w, " ")
4954
}
5055
}
5156
if n < len(buf) {
5257
for i := n; i < len(buf); i++ {
53-
fmt.Printf(" ")
58+
fmt.Fprintf(w, " ")
5459
if i%2 == 1 {
55-
fmt.Print(" ")
60+
fmt.Fprint(w, " ")
5661
}
5762
}
5863
}
5964

60-
fmt.Printf(" ")
65+
fmt.Fprintf(w, " ")
6166

6267
// Character values
6368
b := buf[:n]
6469
for len(b) > 0 {
6570
r, size := utf8.DecodeRune(b)
6671

6772
if int(r) > 0x1f && int(r) < 0x7f {
68-
fmt.Printf("%v", string(r))
73+
fmt.Fprintf(w, "%v", string(r))
6974
} else {
70-
fmt.Printf(".")
75+
fmt.Fprintf(w, ".")
7176
}
7277
b = b[size:]
7378
}
7479

75-
fmt.Printf("\n")
80+
fmt.Fprintf(w, "\n")
7681
}
82+
return nil
7783
}

xxd_test.go

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package main
2+
3+
import (
4+
"bytes"
5+
"flag"
6+
"io"
7+
"io/ioutil"
8+
"os/exec"
9+
"strings"
10+
"testing"
11+
"testing/quick"
12+
)
13+
14+
var xxdFile = flag.String("xxdFile", "", "File to test against.")
15+
16+
func TestXXD(t *testing.T) {
17+
if *xxdFile == "" {
18+
t.Skip("-xxdFile argument not given")
19+
}
20+
data, err := ioutil.ReadFile(*xxdFile)
21+
if err != nil {
22+
t.Fatal(err)
23+
}
24+
test := func(fn func(r io.Reader, w io.Writer) error) func(n uint64) []string {
25+
return func(n uint64) []string {
26+
size := n % uint64(len(data))
27+
var out bytes.Buffer
28+
if err := fn(bytes.NewBuffer(data[0:size]), &out); err != nil {
29+
return []string{err.Error()}
30+
}
31+
return strings.Split(out.String(), "\n")
32+
}
33+
}
34+
if err := quick.CheckEqual(test(XXD), test(xxdNative), nil); err != nil {
35+
cErr := err.(*quick.CheckEqualError)
36+
size := cErr.In[0].(uint64) % uint64(len(data))
37+
for i := range cErr.Out1[0].([]string) {
38+
got := cErr.Out1[0].([]string)[i]
39+
want := cErr.Out2[0].([]string)[i]
40+
if got != want {
41+
t.Errorf("size: %d\n\ngot : %s\nwant: %s\n", size, got, want)
42+
break
43+
}
44+
}
45+
}
46+
}
47+
48+
func xxdNative(r io.Reader, w io.Writer) error {
49+
xxd := exec.Command("xxd", "-")
50+
xxd.Stdin = r
51+
xxd.Stdout = w
52+
xxd.Stderr = w
53+
return xxd.Run()
54+
}

0 commit comments

Comments
 (0)