f1391952d4
* Regenerate test suite * Move test suite to /internal
75 lines
1.9 KiB
Go
75 lines
1.9 KiB
Go
package testsuite
|
|
|
|
import (
|
|
"fmt"
|
|
"math"
|
|
"time"
|
|
|
|
"github.com/pelletier/go-toml/v2"
|
|
)
|
|
|
|
// addTag adds JSON tags to a data structure as expected by toml-test.
|
|
func addTag(key string, tomlData interface{}) interface{} {
|
|
// Switch on the data type.
|
|
switch orig := tomlData.(type) {
|
|
default:
|
|
//return map[string]interface{}{}
|
|
panic(fmt.Sprintf("Unknown type: %T", tomlData))
|
|
|
|
// A table: we don't need to add any tags, just recurse for every table
|
|
// entry.
|
|
case map[string]interface{}:
|
|
typed := make(map[string]interface{}, len(orig))
|
|
for k, v := range orig {
|
|
typed[k] = addTag(k, v)
|
|
}
|
|
return typed
|
|
|
|
// An array: we don't need to add any tags, just recurse for every table
|
|
// entry.
|
|
case []map[string]interface{}:
|
|
typed := make([]map[string]interface{}, len(orig))
|
|
for i, v := range orig {
|
|
typed[i] = addTag("", v).(map[string]interface{})
|
|
}
|
|
return typed
|
|
case []interface{}:
|
|
typed := make([]interface{}, len(orig))
|
|
for i, v := range orig {
|
|
typed[i] = addTag("", v)
|
|
}
|
|
return typed
|
|
|
|
// Datetime: tag as datetime.
|
|
case toml.LocalTime:
|
|
return tag("time-local", orig.String())
|
|
case toml.LocalDate:
|
|
return tag("date-local", orig.String())
|
|
case toml.LocalDateTime:
|
|
return tag("datetime-local", orig.String())
|
|
case time.Time:
|
|
return tag("datetime", orig.Format("2006-01-02T15:04:05.999999999Z07:00"))
|
|
|
|
// Tag primitive values: bool, string, int, and float64.
|
|
case bool:
|
|
return tag("bool", fmt.Sprintf("%v", orig))
|
|
case string:
|
|
return tag("string", orig)
|
|
case int64:
|
|
return tag("integer", fmt.Sprintf("%d", orig))
|
|
case float64:
|
|
// Special case for nan since NaN == NaN is false.
|
|
if math.IsNaN(orig) {
|
|
return tag("float", "nan")
|
|
}
|
|
return tag("float", fmt.Sprintf("%v", orig))
|
|
}
|
|
}
|
|
|
|
func tag(typeName string, data interface{}) map[string]interface{} {
|
|
return map[string]interface{}{
|
|
"type": typeName,
|
|
"value": data,
|
|
}
|
|
}
|