mirror of
https://github.com/sbrow/envr.git
synced 2026-06-27 10:38:33 -04:00
199 lines
5.0 KiB
Odin
199 lines
5.0 KiB
Odin
package main
|
|
|
|
import "core:encoding/json"
|
|
import "core:fmt"
|
|
import "core:strings"
|
|
import "core:testing"
|
|
|
|
@(test)
|
|
test_render_json_rows_normal :: proc(t: ^testing.T) {
|
|
b: strings.Builder
|
|
strings.builder_init(&b)
|
|
defer strings.builder_destroy(&b)
|
|
|
|
headers := []string{"name", "path"}
|
|
rows := [][]string{{"foo", "/home/user/.env"}, {"bar", "/home/user/project/.env"}}
|
|
|
|
w := strings.to_writer(&b)
|
|
render_json_rows(w, headers, rows)
|
|
|
|
output := strings.to_string(b)
|
|
|
|
result: []map[string]string = ---
|
|
unmarshal_err := json.unmarshal_string(output, &result, allocator = context.temp_allocator)
|
|
testing.expect(
|
|
t,
|
|
unmarshal_err == nil,
|
|
fmt.tprintf("json unmarshal failed: %v\noutput was: %q", unmarshal_err, output),
|
|
)
|
|
testing.expect(t, len(result) == 2, fmt.tprintf("expected 2 rows, got %d", len(result)))
|
|
testing.expect(
|
|
t,
|
|
result[0]["name"] == "foo",
|
|
fmt.tprintf("expected name=foo, got %q", result[0]["name"]),
|
|
)
|
|
testing.expect(t, result[0]["path"] == "/home/user/.env")
|
|
testing.expect(t, result[1]["name"] == "bar")
|
|
testing.expect(t, result[1]["path"] == "/home/user/project/.env")
|
|
}
|
|
|
|
@(test)
|
|
test_render_json_rows_special_chars :: proc(t: ^testing.T) {
|
|
b: strings.Builder
|
|
strings.builder_init(&b)
|
|
defer strings.builder_destroy(&b)
|
|
|
|
headers := []string{"key", "value"}
|
|
rows := [][]string {
|
|
{"quote", `has "double quotes"`},
|
|
{"backslash", `path\to\file`},
|
|
{"newline", "line1\nline2"},
|
|
{"mixed", `a "b" c\nd`},
|
|
}
|
|
|
|
w := strings.to_writer(&b)
|
|
render_json_rows(w, headers, rows)
|
|
|
|
output := strings.to_string(b)
|
|
|
|
result: []map[string]string = ---
|
|
unmarshal_err := json.unmarshal(
|
|
transmute([]byte)output,
|
|
&result,
|
|
allocator = context.temp_allocator,
|
|
)
|
|
testing.expect(
|
|
t,
|
|
unmarshal_err == nil,
|
|
fmt.tprintf("json unmarshal failed: %v\noutput was: %q", unmarshal_err, output),
|
|
)
|
|
testing.expect(t, len(result) == 4)
|
|
testing.expect(
|
|
t,
|
|
result[0]["value"] == `has "double quotes"`,
|
|
fmt.tprintf("got %q", result[0]["value"]),
|
|
)
|
|
testing.expect(t, result[1]["value"] == `path\to\file`)
|
|
testing.expect(t, result[2]["value"] == "line1\nline2")
|
|
testing.expect(t, result[3]["value"] == `a "b" c\nd`)
|
|
}
|
|
|
|
@(test)
|
|
test_render_json_rows_empty :: proc(t: ^testing.T) {
|
|
b: strings.Builder
|
|
strings.builder_init(&b)
|
|
defer strings.builder_destroy(&b)
|
|
|
|
headers := []string{"name"}
|
|
rows: [][]string
|
|
|
|
w := strings.to_writer(&b)
|
|
render_json_rows(w, headers, rows)
|
|
|
|
output := strings.to_string(b)
|
|
|
|
result: []map[string]string = ---
|
|
unmarshal_err := json.unmarshal_string(output, &result, allocator = context.temp_allocator)
|
|
testing.expect(
|
|
t,
|
|
unmarshal_err == nil,
|
|
fmt.tprintf("json unmarshal failed: %v\noutput was: %q", unmarshal_err, output),
|
|
)
|
|
testing.expect(t, len(result) == 0)
|
|
}
|
|
|
|
@(test)
|
|
test_render_table_normal :: proc(t: ^testing.T) {
|
|
b: strings.Builder
|
|
strings.builder_init(&b)
|
|
defer strings.builder_destroy(&b)
|
|
|
|
headers := []string{"Name", "Path"}
|
|
rows := [][]string{{"foo", "/home/user/.env"}, {"bar", "/home/user/project/.env"}}
|
|
|
|
w := strings.to_writer(&b)
|
|
render_table(w, headers, rows)
|
|
|
|
output := strings.to_string(b)
|
|
|
|
expected := `┌──────┬─────────────────────────┐
|
|
│ Name │ Path │
|
|
├──────┼─────────────────────────┤
|
|
│ foo │ /home/user/.env │
|
|
│ bar │ /home/user/project/.env │
|
|
└──────┴─────────────────────────┘
|
|
`
|
|
testing.expect(
|
|
t,
|
|
output == expected,
|
|
fmt.tprintf(
|
|
"table output mismatch\n--- expected ---\n%s\n--- got ---\n%s\n",
|
|
expected,
|
|
output,
|
|
),
|
|
)
|
|
}
|
|
|
|
@(test)
|
|
test_render_table_empty :: proc(t: ^testing.T) {
|
|
b: strings.Builder
|
|
strings.builder_init(&b)
|
|
defer strings.builder_destroy(&b)
|
|
|
|
headers := []string{"Name"}
|
|
rows: [][]string
|
|
|
|
w := strings.to_writer(&b)
|
|
render_table(w, headers, rows)
|
|
|
|
output := strings.to_string(b)
|
|
|
|
expected := `┌──────┐
|
|
│ Name │
|
|
├──────┤
|
|
└──────┘
|
|
`
|
|
testing.expect(
|
|
t,
|
|
output == expected,
|
|
fmt.tprintf(
|
|
"table output mismatch\n--- expected ---\n%s\n--- got ---\n%s\n",
|
|
expected,
|
|
output,
|
|
),
|
|
)
|
|
}
|
|
|
|
@(test)
|
|
test_render_table_unicode :: proc(t: ^testing.T) {
|
|
b: strings.Builder
|
|
strings.builder_init(&b)
|
|
defer strings.builder_destroy(&b)
|
|
|
|
headers := []string{"Status", "Detail"}
|
|
rows := [][]string{{"\u2713 Available", "ok"}, {"\u2717 Missing", "fail"}}
|
|
|
|
w := strings.to_writer(&b)
|
|
render_table(w, headers, rows)
|
|
|
|
output := strings.to_string(b)
|
|
|
|
expected := `┌─────────────┬────────┐
|
|
│ Status │ Detail │
|
|
├─────────────┼────────┤
|
|
│ ✓ Available │ ok │
|
|
│ ✗ Missing │ fail │
|
|
└─────────────┴────────┘
|
|
`
|
|
testing.expect(
|
|
t,
|
|
output == expected,
|
|
fmt.tprintf(
|
|
"table output mismatch\n--- expected ---\n%s\n--- got ---\n%s\n",
|
|
expected,
|
|
output,
|
|
),
|
|
)
|
|
}
|
|
|