diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/exercises/exercise.go | 28 | ||||
-rw-r--r-- | src/exercises/exercises_suite_test.go | 54 | ||||
-rw-r--r-- | src/printer/list.go | 4 |
3 files changed, 79 insertions, 7 deletions
diff --git a/src/exercises/exercise.go b/src/exercises/exercise.go index 2783381..22700c8 100644 --- a/src/exercises/exercise.go +++ b/src/exercises/exercise.go @@ -1,11 +1,29 @@ package exercises +import ( + "os" + "regexp" +) + +var notDoneRegex = regexp.MustCompile(`(?m)^\s*///?\s*I\s+AM\s+NOT\s+DONE`) + type Exercise struct { - Name string - Path string - Mode string - Hint string - State State + Name string + Path string + Mode string + Hint string +} + +func (e Exercise) State() State { + data, err := os.ReadFile(e.Path) + if err != nil { + return Pending + } + + if notDoneRegex.Match(data) { + return Pending + } + return Done } type State int diff --git a/src/exercises/exercises_suite_test.go b/src/exercises/exercises_suite_test.go new file mode 100644 index 0000000..8f163da --- /dev/null +++ b/src/exercises/exercises_suite_test.go @@ -0,0 +1,54 @@ +package exercises_test + +import ( + "io/ioutil" + "os" + "testing" + + "github.com/mauricioabreu/golings/src/exercises" + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" +) + +func TestExercises(t *testing.T) { + RegisterFailHandler(Fail) + RunSpecs(t, "Exercises Suite") +} + +var _ = Describe("Exercises", func() { + Describe("Checking exercise state", func() { + When("'I AM NOT DONE' comment is still there", func() { + It("has the Pending state", func() { + file, err := ioutil.TempFile("/tmp", "exercise*.go") + file.Write([]byte(`// exercise1.go + // I AM NOT DONE + package main + + func main() { + + } + `)) + Expect(err).To(BeNil()) + + defer os.Remove(file.Name()) + + ex := exercises.Exercise{Path: file.Name()} + + Expect(ex.State()).To(Equal(exercises.Pending)) + }) + }) + + When("'I AM NOT DONE' comment is not there", func() { + It("has the Done state", func() { + file, err := ioutil.TempFile("/tmp", "exercise*.go") + Expect(err).To(BeNil()) + + defer os.Remove(file.Name()) + + ex := exercises.Exercise{Path: file.Name()} + + Expect(ex.State()).To(Equal(exercises.Done)) + }) + }) + }) +}) diff --git a/src/printer/list.go b/src/printer/list.go index bd65513..cd38c9a 100644 --- a/src/printer/list.go +++ b/src/printer/list.go @@ -10,9 +10,9 @@ import ( func PrintList(o io.Writer, exs []exercises.Exercise) { t := table.NewWriter() t.SetOutputMirror(o) - t.AppendHeader(table.Row{"Name", "Path"}) + t.AppendHeader(table.Row{"Name", "Path", "State"}) for _, ex := range exs { - t.AppendRow(table.Row{ex.Name, ex.Path}) + t.AppendRow(table.Row{ex.Name, ex.Path, ex.State()}) } t.Render() } |