aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/exercises/exercise.go28
-rw-r--r--src/exercises/exercises_suite_test.go54
-rw-r--r--src/printer/list.go4
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()
}