package nginx import ( "bytes" "strings" "testing" ) func TestDecodeEncode(t *testing.T) { tests := []struct { Input string Output string }{ {"key\t\tvalue;\n", "key\t\tvalue;\n"}, {"key value;\n", "key\t\tvalue;\n"}, {"key value;\n", "key\t\tvalue;\n"}, {"key \t value;\n", "key\t\tvalue;\n"}, {"key\tvalue;\n", "key\t\tvalue;\n"}, {"ke-y value;\n", "ke-y\t\tvalue;\n"}, {"ke_y value;\n", "ke_y\t\tvalue;\n"}, {"key value; \n", "key\t\tvalue;\n"}, {"key value;\t\n", "key\t\tvalue;\n"}, {"\tkey value;\n", "key\t\tvalue;\n"}, {" \t key value;\n", "key\t\tvalue;\n"}, {"include ./file/*.conf;\n", "include ./file/*.conf;\n"}, {"include ./file/*.conf; \n", "include ./file/*.conf;\n"}, {"include ./file/*.conf;\t\n", "include ./file/*.conf;\n"}, {"\tinclude ./file/*.conf;\n", "include ./file/*.conf;\n"}, {" \t include ./file/*.conf;\n", "include ./file/*.conf;\n"}, {"sectionname {\n}\n", "sectionname {\n}\n\n"}, {"section-name {\n}\n", "section-name {\n}\n\n"}, {"section_name {\n}\n", "section_name {\n}\n\n"}, {"sectionname { \n}\n", "sectionname {\n}\n\n"}, {"sectionname {\t\n}\n", "sectionname {\n}\n\n"}, {"\tsectionname {\n}\n", "sectionname {\n}\n\n"}, {" \t sectionname {\n}\n", "sectionname {\n}\n\n"}, {"sectionname ~ with-args {\t\n}\n", "sectionname ~ with-args {\n}\n\n"}, {"#some comment\n", "#some comment\n"}, {"#some\tcomment\n", "#some\tcomment\n"}, {"# some comment \n", "# some comment\n"}, {"# some comment \t\n", "# some comment\n"}, {"\t# some comment {\n", "# some comment {\n"}, {";some comment\n", ";some comment\n"}, {"; some\tcomment\n", "; some\tcomment\n"}, {"; some comment\n", "; some comment\n"}, {"; some comment \n", "; some comment\n"}, {"; some comment \t\n", "; some comment\n"}, {"\t; some comment {\n", "; some comment {\n"}, {"a{\n}\n", "a {\n}\n\n"}, {"a{\n\n}\n", "a {\n}\n\n"}, {"a{\n; some comment\n}\n", "a {\n\t; some comment\n}\n\n"}, {"a{\n; some comment\n #another comment\n}\n", "a {\n\t; some comment\n\t#another comment\n}\n\n"}, {"a{\nb{\n}\n}\n", "a {\n\tb {\n\t}\n\n}\n\n"}, {"a{\n\tb{\n\t}\n}\n", "a {\n\tb {\n\t}\n\n}\n\n"}, {"a{\nb{\nc{\n}\n}\n}\n", "a {\n\tb {\n\t\tc {\n\t\t}\n\n\t}\n\n}\n\n"}, } for i, test := range tests { // create reader/writer r, w := strings.NewReader(test.Input), &bytes.Buffer{} // parse input receiver := new(Line) decoder := NewDecoder(r) if err := decoder.Decode(receiver); err != nil { t.Errorf("[%d] unexpected error <%s>", i, err) continue } // encode back to writer encoder := NewEncoder(w) encoder.SetIndent("", "\t") if err := encoder.Encode(receiver); err != nil { t.Errorf("[%d] unexpected error <%s>", i, err) continue } // check equality if w.String() != test.Output { t.Errorf("[%d] expected '%s', got '%s'", i, escape(test.Output), escape(w.String())) } } } func escape(raw string) string { escaped := make([]rune, 0) for _, char := range raw { if char == '\n' { escaped = append(escaped, []rune("\\n")...) } else if char == '\t' { escaped = append(escaped, []rune("\\t")...) } else if char == '\r' { escaped = append(escaped, []rune("\\r")...) } else { escaped = append(escaped, char) } } return string(escaped) }