diff --git a/.golangci.yaml b/.golangci.yaml new file mode 100644 index 0000000..97ee2bf --- /dev/null +++ b/.golangci.yaml @@ -0,0 +1,29 @@ +--- +run: + concurrency: 2 + timeout: 1m + issues-exit-code: 1 + tests: true + +output: + format: colored-line-number + print-issues-lines: true + print-linter-name: true + uniq-by-line: true + sort-results: true + +linters: + enable-all: true + # disable: + fast: false + +linters-settings: + lll: + line-length: 140 + +issues: + exclude-rules: + - path: greet_test.go + linters: + - ifshort + - testpackage diff --git a/go.mod b/go.mod index b269a74..cdb2d7b 100644 --- a/go.mod +++ b/go.mod @@ -1,3 +1,5 @@ module forge.dananglin.me.uk/code/dananglin/greet go 1.17 + +require github.com/magefile/mage v1.11.0 diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..edf273b --- /dev/null +++ b/go.sum @@ -0,0 +1,2 @@ +github.com/magefile/mage v1.11.0 h1:C/55Ywp9BpgVVclD3lRnSYCwXTYxmSppIgLeDYlNuls= +github.com/magefile/mage v1.11.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= diff --git a/greet.go b/greet.go index 21bdfc6..f40984c 100644 --- a/greet.go +++ b/greet.go @@ -2,15 +2,24 @@ package main import ( "fmt" - "os" "io" + "log" + "os" ) +type numberOfArgumentError struct { + length int +} + +func (e numberOfArgumentError) Error() string { + return fmt.Sprintf("unexpected number of arguments passed to the greeter: want 0 or 1 argument, got %d", e.length) +} + func main() { osArgs := os.Args[1:] if err := greet(os.Stdout, osArgs); err != nil { - fmt.Printf("ERROR: %s.\n", err) + log.Fatalf("ERROR: %s.\n", err) } } @@ -18,8 +27,10 @@ func greet(w io.Writer, n []string) error { var name string if len(n) > 1 { - return fmt.Errorf("unexpected number of arguments passed to the greeter: want 0 or 1 argument, got %d", len(n)) - } else if len(n) == 0 { + return numberOfArgumentError{length: len(n)} + } + + if len(n) == 0 { name = "World" } else { name = n[0] diff --git a/greet_test.go b/greet_test.go index a5a7761..460daf4 100644 --- a/greet_test.go +++ b/greet_test.go @@ -7,14 +7,17 @@ import ( // TestGreetNoArguments tests the greeter's response when given no names. func TestGreetNoArguments(t *testing.T) { + t.Parallel() + buffer := new(bytes.Buffer) args := make([]string, 0) if err := greet(buffer, args); err != nil { - t.Fatalf("an error occured while running greet(): %s", err) + t.Fatalf("an error occurred while running greet(): %s", err) } want := "Hello, World!\n" + got := buffer.String() if want != got { @@ -26,14 +29,17 @@ func TestGreetNoArguments(t *testing.T) { // TestGreetOneArgument tests the greeter's response when given one name. func TestGreetOneArgument(t *testing.T) { + t.Parallel() + buffer := new(bytes.Buffer) args := []string{"Sarah"} if err := greet(buffer, args); err != nil { - t.Fatalf("an error occured while running greet(): %s", err) + t.Fatalf("an error occurred while running greet(): %s", err) } want := "Hello, Sarah!\n" + got := buffer.String() if want != got { @@ -45,17 +51,19 @@ func TestGreetOneArgument(t *testing.T) { // TestGreetTwoArguments tests the greeter's response when given two names. func TestGreetTwoArguments(t *testing.T) { + t.Parallel() + buffer := new(bytes.Buffer) args := []string{"Bob", "John"} - want := "unexpected number of arguments passed to the greeter: want 0 or 1 argument, got 2" - err := greet(buffer, args) if err == nil { t.Error("unexpected nil error returned.") } + want := "unexpected number of arguments passed to the greeter: want 0 or 1 argument, got 2" + got := err.Error() if want != got { diff --git a/magefile.go b/magefile.go new file mode 100644 index 0000000..87dcb7a --- /dev/null +++ b/magefile.go @@ -0,0 +1,59 @@ +//go:build mage +// +build mage + +package main + +import ( + "os" + + "github.com/magefile/mage/sh" +) + +const ( + binary = "greet" +) + +var Default = Build + +// Test run the go tests +// To enable verbose mode set PELICAN_TEST_VERBOSE=1. +// To enable coverage mode set PELICAN_TEST_COVER=1. +func Test() error { + goTest := sh.RunCmd("go", "test") + + args := []string{"."} + + if os.Getenv("GO_TEST_VERBOSE") == "1" { + args = append(args, "-v") + } + + if os.Getenv("GO_TEST_COVER") == "1" { + args = append(args, "-cover") + } + + return goTest(args...) +} + +// Lint runs golangci-lint against the code. +func Lint() error { + return sh.RunV("golangci-lint", "run", "--color", "always") +} + +// Build build the executable +func Build() error { + main := "greet.go" + return sh.Run("go", "build", "-o", binary, main) +} + +// Clean clean the workspace +func Clean() error { + if err := sh.Rm(binary); err != nil { + return err + } + + if err := sh.Run("go", "clean", "."); err != nil { + return err + } + + return nil +}