Browse Source

Use embed for space.ans. Tests.

Steve Thielemann 2 years ago
parent
commit
40ff214ac5
6 changed files with 217 additions and 43 deletions
  1. 10 14
      config.go
  2. 93 0
      config_test.go
  3. 17 3
      space-ace.go
  4. 1 1
      space.ans
  5. 19 25
      space.go
  6. 77 0
      utils_test.go

+ 10 - 14
config.go

@@ -4,7 +4,6 @@ import (
 	"bufio"
 	"errors"
 	"fmt"
-	"log"
 	"os"
 	"sort"
 	"strings"
@@ -15,16 +14,16 @@ func FileExists(path string) bool {
 	return !errors.Is(err, os.ErrNotExist)
 }
 
-func LoadConfig(filename string) map[string]string {
+func LoadConfig(filename string) (map[string]string, error) {
+	var results map[string]string = make(map[string]string)
+
 	file, err := os.Open(filename)
 	if err != nil {
-		log.Panicf("Open(%s): %s\n", filename, err)
+		return results, err
 	}
 
 	defer file.Close()
 
-	var results map[string]string = make(map[string]string)
-
 	scanner := bufio.NewScanner(file)
 	for scanner.Scan() {
 		line := scanner.Text()
@@ -51,14 +50,13 @@ func LoadConfig(filename string) map[string]string {
 			// 	fmt.Printf("I'm not sure about [%s]\n", line)
 		}
 	}
-	return results
-
+	return results, nil
 }
 
-func SaveConfig(filename string, config map[string]string) {
+func SaveConfig(filename string, config map[string]string) error {
 	file, err := os.Create(filename)
 	if err != nil {
-		log.Panicf("Open(%s): %s\n", filename, err)
+		return err
 	}
 
 	defer file.Close()
@@ -74,14 +72,12 @@ func SaveConfig(filename string, config map[string]string) {
 	for _, key := range keys {
 		fmt.Fprintf(file, "%s: %s\n", key, config[key])
 	}
+	return nil
 }
 
 // SetConfigDefault Set default value (if not present)
 func SetConfigDefault(config *map[string]string, key string, value string) bool {
 	_, ok := (*config)[key]
-	if !ok {
-		(*config)[key] = value
-		return true
-	}
-	return false
+	(*config)[key] = value
+	return !ok
 }

+ 93 - 0
config_test.go

@@ -0,0 +1,93 @@
+package main
+
+import (
+	"os"
+	"os/user"
+	"testing"
+)
+
+func TestConfig(t *testing.T) {
+	var filename string = "/invalid"
+
+	testValues := map[string]string{
+		"turns":  "5",
+		"planet": "Earth",
+		"size":   "Medium",
+		"PI":     "Raspberry",
+	}
+
+	u, err := user.Current()
+	if err != nil {
+		t.Fatalf("user.Current: %v", err)
+	}
+
+	if u.Name == "root" {
+		t.Skip("Don't run tests as root.")
+	}
+
+	err = SaveConfig(filename, testValues)
+
+	if err == nil {
+		t.Errorf("SaveConfig: Expected error writing to %s\n", filename)
+	}
+
+	fail, err := LoadConfig(filename)
+
+	if fail == nil {
+		t.Errorf("LoadConfig: Expected error reading %s\n", filename)
+	}
+
+	filename = ".test.config"
+	os.Remove(filename)
+
+	if FileExists(filename) {
+		t.Errorf("FileExists says %s exists.\n", filename)
+	}
+
+	err = SaveConfig(filename, testValues)
+	if err != nil {
+		t.Errorf("SaveConfig: %s\n", err)
+	}
+
+	file, err := os.OpenFile(filename, os.O_APPEND|os.O_RDWR, 0666)
+	if err != nil {
+		t.Errorf("OpenFile %s : %s\n", filename, err)
+	}
+
+	file.WriteString("\n")
+	file.WriteString("# Comment goes here\n")
+	file.Close()
+
+	if !FileExists(filename) {
+		t.Errorf("FileExists say %s missing.\n", filename)
+	}
+
+	got, err := LoadConfig(filename)
+	if err != nil {
+		t.Errorf("LoadConfig: Got error reading %s : %s\n", filename, err)
+	}
+
+	for k, v := range got {
+		testValue, ok := testValues[k]
+		if !ok {
+			t.Errorf("LoadConfig key %s wasn't in original\n", k)
+		} else {
+			if testValue != v {
+				t.Errorf("LoadConfig key %s expected %s, got %s\n", k, v, testValue)
+			}
+		}
+	}
+
+	os.Remove(filename)
+	var b bool
+
+	b = SetConfigDefault(&got, "turns", "10")
+	if !b {
+		t.Errorf("Setting existing key default failed.\n")
+	}
+
+	b = SetConfigDefault(&got, "missing", "yes")
+	if b {
+		t.Errorf("Setting missing default returned true.\n")
+	}
+}

+ 17 - 3
space-ace.go

@@ -2,6 +2,7 @@ package main
 
 import (
 	"fmt"
+	"log"
 	"math/rand"
 	"os"
 	"path/filepath"
@@ -474,9 +475,13 @@ func main() {
 	db.User = d.Config.Real_name
 
 	const config_filename = "space-ace.yaml"
-
+	var err error
 	if FileExists(config_filename) {
-		Config = LoadConfig(config_filename)
+		Config, err = LoadConfig(config_filename)
+		if err != nil {
+			log.Printf("LoadConfig( %s ): %s\n", config_filename, err)
+			Config = make(map[string]string)
+		}
 	} else {
 		Config = make(map[string]string)
 	}
@@ -513,7 +518,16 @@ func main() {
 	starfield.Regenerate(rng)
 
 	starfield.Display(&d)
-	d.Write(door.Goto(1, 1) + door.Reset)
+	// d.Write(door.Goto(1, 1))
+	cx := (door.Width - 72) / 2
+	if cx < 0 {
+		cx = 1
+	}
+
+	for idx, line := range ANSISpace() {
+		d.Write(door.Goto(cx, idx+3) + line)
+	}
+	d.Write(door.Reset + door.CRNL)
 
 	// Get the last call value (if they have called before)
 	last_call, _ := strconv.ParseInt(db.GetSetting("LastCall", "0"), 10, 64)

+ 1 - 1
space.ans

@@ -1,4 +1,4 @@
-[?7hワイイイイロワ アアイイロロアイイロアイイロロアイイロロアイイロアイイロロアイイロロ
+ワイイイイロワ アアイイロロアイイロアイイロロアイイロロアイイロアイイロロアイイロロ
 アアロアアロローアイローアロローアロローアイローアロローアロロ
 ーアワワワワ   ーアイロ ーイローーーーワワ ーイローーーーワワ
  ゚゚゚゚イイーーアアイ  ーーアアイイ ー ー゚゚  ーーアアイイ ー ー゚゚

+ 19 - 25
space.go

@@ -1,31 +1,25 @@
 package main
 
 import (
-  "red-green/door"
-  "log"
-  )
+	_ "embed"
+	"log"
+	"red-green/door"
+	"strings"
+)
+
+//go:embed space.ans
+var space string
 
 func ANSISpace() []string {
-  data := []string {
-    "\x1b[?7h\x1b[255D\x1b[0;1;32m\xdc\x1b[42m\xb2\xb2\xb2\xb2\xdb\x1b[40m\xdc \x1b[42m\xb1\xb1\xb2\xb2\xdb\xdb\x1b[4C\xb1\xb2\xb2\xdb\x1b[4C\xb1\xb2\xb2\xdb\xdb\x1b[3C\xb1\xb2\xb2\xdb\xdb\x1b[11C\xb1\xb2\xb2\xdb\x1b[4C\xb1\xb2\xb2\xdb\xdb\x1b[3C\xb1\xb2\xb2\xdb\xdb\x1b[40m",
-    "\x1b[42m\xb1\xb1\x1b[4C\xdb\x1b[2C\xb1\xb1\x1b[2C\xdb\xdb\x1b[2C\xb0\xb1\x1b[2C\xb2\xdb\x1b[2C\xb0\xb1\x1b[3C\xdb\xdb\x1b[1C\xb0\xb1\x1b[3C\xdb\xdb\x1b[9C\xb0\xb1\x1b[2C\xb2\xdb\x1b[2C\xb0\xb1\x1b[3C\xdb\xdb\x1b[1C\xb0\xb1\x1b[3C\xdb\xdb\x1b[40m",
-    "\x1b[42m\xb0\xb1\x1b[40m\xdc\xdc\xdc\xdc   \x1b[42m\xb0\xb1\x1b[2C\xb2\xdb\x1b[1C \xb0\x1b[4C\xb2\xdb\x1b[1C\xb0\xb0\x1b[6C\xb0\xb0\x1b[0;32m\xdc\xdc\x1b[11C\x1b[42m \x1b[1m\xb0\x1b[4C\xb2\xdb\x1b[1C\xb0\xb0\x1b[6C\xb0\xb0\x1b[0;32m\xdc\xdc",
-    " \x1b[1m\xdf\xdf\xdf\xdf\x1b[42m\xb2\xb2\x1b[2C\xb0\xb0\xb1\xb1\xb2\x1b[2C  \xb0\xb0\xb1\xb1\xb2\xb2\x1b[1C \xb0\x1b[6C \xb0\x1b[0;32m\xdf\xdf\x1b[11C\x1b[42m  \x1b[1m\xb0\xb0\xb1\xb1\xb2\xb2\x1b[1C \xb0\x1b[6C \xb0\x1b[0;32m\xdf\xdf",
-    "\xdb    \x1b[1;42m\xb1\xb2\x1b[2C \xb0\x1b[5C  \x1b[4C\xb1\xb2\x1b[1C  \x1b[3C\xb1\xb2\x1b[1C  \x1b[3C\xb1\xb2\x1b[8C  \x1b[4C\xb1\xb2\x1b[1C  \x1b[3C\xb1\xb2\x1b[1C  \x1b[3C\xb1\xb2\x1b[40m",
-    "\x1b[0;32m\xdf\x1b[42m \x1b[40m\xdb\x1b[1;42m\xb0\xb0\xb1\x1b[0;32m\xdf \x1b[42m  \x1b[7C  \x1b[2C\x1b[1m\xb0\xb1\x1b[3C  \xb0\xb0\xb1\x1b[3C  \xb0\xb0\xb1\x1b[10C  \x1b[2C\xb0\xb1\x1b[3C  \xb0\xb0\xb1\x1b[3C  \xb0\xb0\xb1\x1b[40m",
-    "",
-    "",
-    "\x1b[37mBugz in space, with a deck of cards",
-    "\x1b[0m",
-  }
-  if !door.Unicode && !door.CP437 {
-    log.Panicf("Call after door.Init() so Unicode/CP437 has been set.")
-  }
-  if door.Unicode {
-    for idx := range data {
-      data[idx] = door.CP437_to_Unicode(data[idx])
-    }
-  }
-  return data
-}
+	data := strings.Split(space, "\n")
 
+	if !door.Unicode && !door.CP437 {
+		log.Panicf("Call after door.Init() so Unicode/CP437 has been set.")
+	}
+	if door.Unicode {
+		for idx := range data {
+			data[idx] = door.CP437_to_Unicode(data[idx])
+		}
+	}
+	return data
+}

+ 77 - 0
utils_test.go

@@ -0,0 +1,77 @@
+package main
+
+import (
+	"testing"
+	"time"
+)
+
+func TestByte(t *testing.T) {
+	table_int32 := map[int32][4]byte{
+		0x12345678: {0x12, 0x34, 0x56, 0x78},
+	}
+
+	for i32, b4 := range table_int32 {
+		out := Int32toByteArray(i32)
+		if out != b4 {
+			t.Errorf("Expected %v, got %v\n", b4, out)
+		}
+	}
+
+	table_int64 := map[int64][8]byte{
+		0x0123456789123456: {0x01, 0x23, 0x45, 0x67, 0x89, 0x12, 0x34, 0x56},
+	}
+
+	for i64, b8 := range table_int64 {
+		out := Int64toByteArray(i64)
+		if out != b8 {
+			t.Errorf("Expected %v, got %v\n", b8, out)
+		}
+	}
+}
+
+func TestWord(t *testing.T) {
+	table := map[string][][]int{
+		"this is a test": {{0, 4}, {5, 7}, {8, 9}, {10, 14}},
+	}
+
+	for s, e := range table {
+		out := find_words(s)
+		if len(out) != len(e) {
+			t.Errorf("Expected %d, got %d\n", len(e), len(out))
+		} else {
+			for x := range e {
+				ex := e[x]
+				ox := out[x]
+				if (ex[0] != ox[0]) || (ex[1] != ox[1]) {
+					t.Errorf("Expected %v, got %v\n", ex, ox)
+				}
+			}
+		}
+	}
+}
+
+func TestFormat(t *testing.T) {
+	dt := time.Date(2022, 11, 25, 4, 5, 6, 0, time.Local)
+	table := map[string]string{
+		"2006-01-02":      "2022-11-25",
+		"January 2, 2006": "November 25, 2022",
+	}
+
+	for f, e := range table {
+		out := FormatDate(dt.Unix(), f)
+		if out != e {
+			t.Errorf("Expected %s, got %s\n", e, out)
+		}
+	}
+}
+
+func TestAbs(t *testing.T) {
+	var table = [][2]int{{-5, 5}, {-1, 1}, {5, 5}, {0, 0}, {-1000, 1000}}
+
+	for _, i := range table {
+		g := Abs(i[0])
+		if g != i[1] {
+			t.Errorf("Abs expected %d, got %d\n", i[1], g)
+		}
+	}
+}