Skip to content

Commit

Permalink
Add numeronyms functionality
Browse files Browse the repository at this point in the history
Implemented numeronym functionality in a executable Go program which
returns a slice of numeronyms given an input of n strings

Closes Lab 04 (#419)
  • Loading branch information
patrickmarabeas committed Jun 18, 2019
1 parent aaf4667 commit da422eb
Show file tree
Hide file tree
Showing 2 changed files with 116 additions and 0 deletions.
36 changes: 36 additions & 0 deletions 04_numeronym/patrickmarabeas/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package main

import (
"fmt"
"io"
"os"
)

var out io.Writer = os.Stdout

// Convert string to a numeronym
func generateNumeronym(s string) string {
length := len(s)
// Early bailout if string is less than 4 characters
if length < 4 {
return s
}
// Format as "{unicode character}{decimal}{unicode character}"
return fmt.Sprintf("%c%d%c", s[0], length-2, s[length-1])
}

// Convert n strings into a slice of numeronyms
func numeronyms(vals ...string) []string {
result := make([]string, len(vals))
i := 0
for _, numeronym := range vals {
result[i] = generateNumeronym(numeronym)
i++
}

return result
}

func main() {
fmt.Fprintln(out, numeronyms("accessibility", "Kubernetes", "abc"))
}
80 changes: 80 additions & 0 deletions 04_numeronym/patrickmarabeas/main_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
package main

import (
"bytes"
"fmt"
"testing"
)

func TestMainOutput(t *testing.T) {
var buf bytes.Buffer
out = &buf

main()

expected := fmt.Sprintf("%s\n", "[a11y K8s abc]")
got := buf.String()

t.Run("Main function", func(t *testing.T) {
if expected != got {
t.Errorf("\nExpected: %s\nGot: %s", expected, got)
}
})
}

func TestGenerateNumeronym(t *testing.T) {
var cases = map[string]struct {
input string
expected string
}{
"Lowercase": {
input: "lowercase",
expected: "l7e",
},
"Uppercase": {
input: "Uppercase",
expected: "U7e",
},
"Three letters": {
input: "abc",
expected: "abc",
},
"Two letters": {
input: "ab",
expected: "ab",
},
"Single letter": {
input: "a",
expected: "a",
},
"Empty": {
input: "",
expected: "",
},
}

for name, c := range cases {
got, expected := generateNumeronym(c.input), c.expected
t.Run(name, func(t *testing.T) {
if got != expected {
t.Errorf("\nExpected: %s\nGot: %s", expected, got)
}
})
}
}

func TestNumeronyms(t *testing.T) {
test := numeronyms("lowercase", "Uppercase")
expected := []string{"l7e", "U7e"}

for i, got := range test {
// Lint error: Using the variable on range scope `got` / `i` in function literal
i := i
got := got
t.Run(fmt.Sprintf("String of index %d", i), func(t *testing.T) {
if got != expected[i] {
t.Errorf("\nExpected: %s\nGot: %s", expected[i], got)
}
})
}
}

0 comments on commit da422eb

Please sign in to comment.