diff options
Diffstat (limited to 'scfg/writer_test.go')
-rw-r--r-- | scfg/writer_test.go | 158 |
1 files changed, 158 insertions, 0 deletions
diff --git a/scfg/writer_test.go b/scfg/writer_test.go new file mode 100644 index 0000000..b27d513 --- /dev/null +++ b/scfg/writer_test.go @@ -0,0 +1,158 @@ +package scfg + +import ( + "bytes" + "testing" +) + +func TestWrite(t *testing.T) { + for _, tc := range []struct { + src Block + want string + err error + }{ + { + src: Block{}, + want: "", + }, + { + src: Block{{ + Name: "dir", + Children: Block{{ + Name: "blk1", + Params: []string{"p1", `"p2"`}, + Children: Block{ + { + Name: "sub1", + Params: []string{"arg11", "arg12"}, + }, + { + Name: "sub2", + Params: []string{"arg21", "arg22"}, + }, + { + Name: "sub3", + Params: []string{"arg31", "arg32"}, + Children: Block{ + { + Name: "sub-sub1", + }, + { + Name: "sub-sub2", + Params: []string{"arg321", "arg322"}, + }, + }, + }, + }, + }}, + }}, + want: `dir { + blk1 p1 "\"p2\"" { + sub1 arg11 arg12 + sub2 arg21 arg22 + sub3 arg31 arg32 { + sub-sub1 + sub-sub2 arg321 arg322 + } + } +} +`, + }, + { + src: Block{{Name: "dir1"}}, + want: "dir1\n", + }, + { + src: Block{{Name: "dir\"1"}}, + want: "\"dir\\\"1\"\n", + }, + { + src: Block{{Name: "dir'1"}}, + want: "\"dir'1\"\n", + }, + { + src: Block{{Name: "dir:}"}}, + want: "\"dir:}\"\n", + }, + { + src: Block{{Name: "dir:{"}}, + want: "\"dir:{\"\n", + }, + { + src: Block{{Name: "dir\t1"}}, + want: `"dir` + "\t" + `1"` + "\n", + }, + { + src: Block{{Name: "dir 1"}}, + want: "\"dir 1\"\n", + }, + { + src: Block{{Name: "dir1", Params: []string{"arg1", "arg2", `"arg3"`}}}, + want: "dir1 arg1 arg2 " + `"\"arg3\""` + "\n", + }, + { + src: Block{{Name: "dir1", Params: []string{"arg1", "arg 2", "arg'3"}}}, + want: "dir1 arg1 \"arg 2\" \"arg'3\"\n", + }, + { + src: Block{{Name: "dir1", Params: []string{"arg1", "", "arg3"}}}, + want: "dir1 arg1 \"\" arg3\n", + }, + { + src: Block{{Name: "dir1", Params: []string{"arg1", `"` + "\"\"" + `"`, "arg3"}}}, + want: "dir1 arg1 " + `"\"\"\"\""` + " arg3\n", + }, + { + src: Block{{ + Name: "dir1", + Children: Block{ + {Name: "sub1"}, + {Name: "sub2", Params: []string{"arg1", "arg2"}}, + }, + }}, + want: `dir1 { + sub1 + sub2 arg1 arg2 +} +`, + }, + { + src: Block{{Name: ""}}, + err: errDirEmptyName, + }, + { + src: Block{{ + Name: "dir", + Children: Block{ + {Name: "sub1"}, + {Name: "", Children: Block{{Name: "sub21"}}}, + }, + }}, + err: errDirEmptyName, + }, + } { + t.Run("", func(t *testing.T) { + var buf bytes.Buffer + err := Write(&buf, tc.src) + switch { + case err != nil && tc.err != nil: + if got, want := err.Error(), tc.err.Error(); got != want { + t.Fatalf("invalid error:\ngot= %q\nwant=%q", got, want) + } + return + case err == nil && tc.err != nil: + t.Fatalf("got err=nil, want=%q", tc.err.Error()) + case err != nil && tc.err == nil: + t.Fatalf("could not marshal: %+v", err) + case err == nil && tc.err == nil: + // ok. + } + if got, want := buf.String(), tc.want; got != want { + t.Fatalf( + "invalid marshal representation:\ngot:\n%s\nwant:\n%s\n---", + got, want, + ) + } + }) + } +} |