Fin/tests/config_test.go
2025-03-01 21:10:04 -06:00

317 lines
7.6 KiB
Go

package config_test
import (
"reflect"
"strings"
"testing"
config "git.sharkk.net/Go/Config"
)
func TestBasicKeyValuePairs(t *testing.T) {
input := `
boolTrue = true
boolFalse = false
integer = 42
negativeInt = -10
floatValue = 3.14
negativeFloat = -2.5
stringValue = "hello world"
`
config, err := config.Load(strings.NewReader(input))
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
// Verify boolean values
boolTrue, err := config.GetBool("boolTrue")
if err != nil || boolTrue != true {
t.Errorf("expected boolTrue=true, got %v, err: %v", boolTrue, err)
}
boolFalse, err := config.GetBool("boolFalse")
if err != nil || boolFalse != false {
t.Errorf("expected boolFalse=false, got %v, err: %v", boolFalse, err)
}
// Verify integer values
integer, err := config.GetInt("integer")
if err != nil || integer != 42 {
t.Errorf("expected integer=42, got %v, err: %v", integer, err)
}
negativeInt, err := config.GetInt("negativeInt")
if err != nil || negativeInt != -10 {
t.Errorf("expected negativeInt=-10, got %v, err: %v", negativeInt, err)
}
// Verify float values
floatValue, err := config.GetFloat("floatValue")
if err != nil || floatValue != 3.14 {
t.Errorf("expected floatValue=3.14, got %v, err: %v", floatValue, err)
}
negativeFloat, err := config.GetFloat("negativeFloat")
if err != nil || negativeFloat != -2.5 {
t.Errorf("expected negativeFloat=-2.5, got %v, err: %v", negativeFloat, err)
}
// Verify string values
stringValue, err := config.GetString("stringValue")
if err != nil || stringValue != "hello world" {
t.Errorf("expected stringValue=\"hello world\", got %v, err: %v", stringValue, err)
}
// Verify missing key handling
_, err = config.GetString("nonExistentKey")
if err == nil {
t.Errorf("expected error for non-existent key, got nil")
}
// Test GetOr with defaults
defaultBool := config.GetOr("nonExistentKey", true).(bool)
if defaultBool != true {
t.Errorf("expected GetOr to return default true, got %v", defaultBool)
}
defaultString := config.GetOr("nonExistentKey", "default").(string)
if defaultString != "default" {
t.Errorf("expected GetOr to return 'default', got %v", defaultString)
}
}
func TestComments(t *testing.T) {
input := `
-- This is a line comment
key1 = "value1"
--[[ This is a
block comment spanning
multiple lines ]]
key2 = "value2"
settings {
-- Comment inside a map
timeout = 30
--[[ Another block comment ]]
retries = 3
}
`
config, err := config.Load(strings.NewReader(input))
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
// Verify that comments are properly ignored and values are parsed
val1, err := config.GetString("key1")
if err != nil || val1 != "value1" {
t.Errorf("expected key1=\"value1\", got %v, err: %v", val1, err)
}
val2, err := config.GetString("key2")
if err != nil || val2 != "value2" {
t.Errorf("expected key2=\"value2\", got %v, err: %v", val2, err)
}
// Verify nested values after comments
timeout, err := config.GetInt("settings.timeout")
if err != nil || timeout != 30 {
t.Errorf("expected settings.timeout=30, got %v, err: %v", timeout, err)
}
retries, err := config.GetInt("settings.retries")
if err != nil || retries != 3 {
t.Errorf("expected settings.retries=3, got %v, err: %v", retries, err)
}
}
func TestArrays(t *testing.T) {
input := `
-- Simple array
fruits {
"apple"
"banana"
"cherry"
}
-- Array with equals sign
numbers = {
1
2
3
4
5
}
-- Mixed types array
mixed {
"string"
42
true
3.14
}
`
config, err := config.Load(strings.NewReader(input))
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
// Verify simple array
fruits, err := config.GetArray("fruits")
if err != nil {
t.Fatalf("failed to get fruits array: %v", err)
}
expectedFruits := []any{"apple", "banana", "cherry"}
if !reflect.DeepEqual(fruits, expectedFruits) {
t.Errorf("expected fruits=%v, got %v", expectedFruits, fruits)
}
// Verify array accessed with index notation
apple, err := config.GetString("fruits.0")
if err != nil || apple != "apple" {
t.Errorf("expected fruits.0=\"apple\", got %v, err: %v", apple, err)
}
// Verify array with equals sign
numbers, err := config.GetArray("numbers")
if err != nil {
t.Fatalf("failed to get numbers array: %v", err)
}
// Check array length
if len(numbers) != 5 {
t.Errorf("expected 5 numbers, got %d", len(numbers))
}
// Verify first number
firstNumber, err := config.GetInt("numbers.0")
if err != nil || firstNumber != 1 {
t.Errorf("expected numbers.0=1, got %v, err: %v", firstNumber, err)
}
// Verify mixed types array
mixed, err := config.GetArray("mixed")
if err != nil {
t.Fatalf("failed to get mixed array: %v", err)
}
if len(mixed) != 4 {
t.Errorf("expected 4 items in mixed array, got %d", len(mixed))
}
// Check types in mixed array
stringVal, err := config.GetString("mixed.0")
if err != nil || stringVal != "string" {
t.Errorf("expected mixed.0=\"string\", got %v, err: %v", stringVal, err)
}
intVal, err := config.GetInt("mixed.1")
if err != nil || intVal != 42 {
t.Errorf("expected mixed.1=42, got %v, err: %v", intVal, err)
}
boolVal, err := config.GetBool("mixed.2")
if err != nil || boolVal != true {
t.Errorf("expected mixed.2=true, got %v, err: %v", boolVal, err)
}
floatVal, err := config.GetFloat("mixed.3")
if err != nil || floatVal != 3.14 {
t.Errorf("expected mixed.3=3.14, got %v, err: %v", floatVal, err)
}
}
func TestMaps(t *testing.T) {
input := `
-- Simple map
server {
host = "localhost"
port = 8080
}
-- Map with equals sign
database = {
username = "admin"
password = "secret"
enabled = true
maxConnections = 100
}
-- Nested maps
application {
name = "MyApp"
version = "1.0.0"
settings {
theme = "dark"
notifications = true
logging {
level = "info"
file = "app.log"
}
}
}
`
config, err := config.Load(strings.NewReader(input))
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
// Verify simple map
serverMap, err := config.GetMap("server")
if err != nil {
t.Fatalf("failed to get server map: %v", err)
}
if len(serverMap) != 2 {
t.Errorf("expected 2 items in server map, got %d", len(serverMap))
}
// Verify dot notation access
host, err := config.GetString("server.host")
if err != nil || host != "localhost" {
t.Errorf("expected server.host=\"localhost\", got %v, err: %v", host, err)
}
port, err := config.GetInt("server.port")
if err != nil || port != 8080 {
t.Errorf("expected server.port=8080, got %v, err: %v", port, err)
}
// Verify map with equals sign
dbUser, err := config.GetString("database.username")
if err != nil || dbUser != "admin" {
t.Errorf("expected database.username=\"admin\", got %v, err: %v", dbUser, err)
}
dbEnabled, err := config.GetBool("database.enabled")
if err != nil || dbEnabled != true {
t.Errorf("expected database.enabled=true, got %v, err: %v", dbEnabled, err)
}
// Verify deeply nested maps
appName, err := config.GetString("application.name")
if err != nil || appName != "MyApp" {
t.Errorf("expected application.name=\"MyApp\", got %v, err: %v", appName, err)
}
theme, err := config.GetString("application.settings.theme")
if err != nil || theme != "dark" {
t.Errorf("expected application.settings.theme=\"dark\", got %v, err: %v", theme, err)
}
logLevel, err := config.GetString("application.settings.logging.level")
if err != nil || logLevel != "info" {
t.Errorf("expected application.settings.logging.level=\"info\", got %v, err: %v", logLevel, err)
}
// Test non-existent nested paths
_, err = config.GetString("application.settings.nonexistent")
if err == nil {
t.Errorf("expected error for non-existent nested key, got nil")
}
}