diff --git a/clockface/clockface.go b/clockface/clockface.go index 558a75c..06fade1 100644 --- a/clockface/clockface.go +++ b/clockface/clockface.go @@ -1,6 +1,8 @@ package clockface import ( + "fmt" + "io" "math" "time" ) @@ -11,13 +13,43 @@ type Point struct { Y float64 } +const ( + secondHandLength = 90 + clockCentreX = 150 + clockCentreY = 150 +) + +const svgStart = ` + +` + +const bezel = `` + +const svgEnd = `` + +func SVGWriter(w io.Writer, t time.Time) { + io.WriteString(w, svgStart) + io.WriteString(w, bezel) + SecondHand(w, t) + io.WriteString(w, svgEnd) +} + // SecondHand is the unit vector of the second hand of an analogue clock at the time `t` represented as a Point -func SecondHand(t time.Time) Point { +func SecondHand(w io.Writer, t time.Time) { p := secondHandPoint(t) - p = Point{p.X * 90, p.Y * 90} // scale - p = Point{p.X, -p.Y} // flip - p = Point{p.X + 150, p.Y + 150} // translate - return p + p = Point{p.X * secondHandLength, p.Y * secondHandLength} // scale + p = Point{p.X, -p.Y} // flip + p = Point{p.X + clockCentreX, p.Y + clockCentreY} // translate + fmt.Fprintf( + w, + ``, + p.X, + p.Y, + ) } func secondsInRadians(t time.Time) float64 { diff --git a/clockface/clockface_acceptance_test.go b/clockface/clockface_acceptance_test.go index 367f8a7..080a84f 100644 --- a/clockface/clockface_acceptance_test.go +++ b/clockface/clockface_acceptance_test.go @@ -1,28 +1,81 @@ package clockface import ( + "bytes" + "encoding/xml" "testing" "time" ) -func TestSecondHandAtMidnight(t *testing.T) { +type Svg struct { + XMLName xml.Name `xml:"svg"` + Text string `xml:",chardata"` + Xmlns string `xml:"xmlns,attr"` + Width string `xml:"width,attr"` + Height string `xml:"height,attr"` + ViewBox string `xml:"viewBox,attr"` + Version string `xml:"version,attr"` + Circle struct { + Text string `xml:",chardata"` + Cx string `xml:"cx,attr"` + Cy string `xml:"cy,attr"` + R string `xml:"r,attr"` + Style string `xml:"style,attr"` + } `xml:"circle"` + Line []struct { + Text string `xml:",chardata"` + X1 string `xml:"x1,attr"` + Y1 string `xml:"y1,attr"` + X2 string `xml:"x2,attr"` + Y2 string `xml:"y2,attr"` + Style string `xml:"style,attr"` + } `xml:"line"` +} + +// func TestSecondHandAtMidnight(t *testing.T) { +// tm := time.Date(1337, time.January, 1, 0, 0, 0, 0, time.UTC) +// +// want := Point{X: 150, Y: 150 - 90} +// got := SecondHand(tm) +// +// if got != want { +// t.Errorf("Got %v, wanted %v", got, want) +// } +// } + +// func TestSecondHandAt30Seconds(t *testing.T) { +// tm := time.Date(1337, time.January, 1, 0, 0, 30, 0, time.UTC) +// +// want := Point{X: 150, Y: 150 + 90} +// got := SecondHand(tm) +// +// if got != want { +// t.Errorf("Got %v, wanted %v", got, want) +// } +// } + +func TestSVGWriterAtMidnight(t *testing.T) { tm := time.Date(1337, time.January, 1, 0, 0, 0, 0, time.UTC) - want := Point{X: 150, Y: 150 - 90} - got := SecondHand(tm) + b := bytes.Buffer{} + SVGWriter(&b, tm) - if got != want { - t.Errorf("Got %v, wanted %v", got, want) - } -} - -func TestSecondHandAt30Seconds(t *testing.T) { - tm := time.Date(1337, time.January, 1, 0, 0, 30, 0, time.UTC) - - want := Point{X: 150, Y: 150 + 90} - got := SecondHand(tm) - - if got != want { - t.Errorf("Got %v, wanted %v", got, want) + svg := Svg{} + xml.Unmarshal(b.Bytes(), &svg) + + x2 := "150.000000" + y2 := "60.000000" + + for _, line := range svg.Line { + if line.X2 == x2 && line.Y2 == y2 { + return + } } + + t.Errorf( + "Expected to find the second hand with x2 of %+v and y2 of %+v, in the SVG output %v", + x2, + y2, + b.String(), + ) } diff --git a/main.go b/main.go index 542bc44..8cbc3e5 100644 --- a/main.go +++ b/main.go @@ -1,9 +1,7 @@ package main import ( - "fmt" "gobytest/clockface" - "io" "os" "time" ) @@ -18,29 +16,5 @@ func main() { // clockface t := time.Now() - sh := clockface.SecondHand(t) - io.WriteString(os.Stdout, svgStart) - io.WriteString(os.Stdout, bezel) - io.WriteString(os.Stdout, secondHandTag(sh)) - io.WriteString(os.Stdout, svgEnd) + clockface.SVGWriter(os.Stdout, t) } - -func secondHandTag(p clockface.Point) string { - return fmt.Sprintf( - ``, - p.X, - p.Y, - ) -} - -const svgStart = ` - -` - -const bezel = `` - -const svgEnd = ``