nip/tests/test_variant_mapper.nim

296 lines
8.2 KiB
Nim

## test_variant_mapper.nim
## Unit tests for VariantMapper
import std/[unittest, tables, json, os]
import ../src/nimpak/build/variant_mapper
suite "VariantMapper Tests":
test "VariantMapper initialization":
let mapper = newVariantMapper()
check mapper != nil
check mapper.customMappings.len == 0
test "Map generic variant to Nix":
let mapper = newVariantMapper()
let flag = mapper.mapToSource("firefox", "graphics", "wayland", "nix")
check flag == "waylandSupport = true"
test "Map generic variant to PKGSRC":
let mapper = newVariantMapper()
let flag = mapper.mapToSource("firefox", "graphics", "wayland", "pkgsrc")
check flag == "wayland"
test "Map generic variant to Gentoo":
let mapper = newVariantMapper()
let flag = mapper.mapToSource("firefox", "graphics", "wayland", "gentoo")
check flag == "wayland"
test "Map package-specific variant":
let mapper = newVariantMapper()
# Firefox has package-specific mapping for audio/pipewire
let nixFlag = mapper.mapToSource("firefox", "audio", "pipewire", "nix")
let pkgsrcFlag = mapper.mapToSource("firefox", "audio", "pipewire", "pkgsrc")
check nixFlag == "pipewireSupport = true"
check pkgsrcFlag == "pulseaudio" # PKGSRC firefox uses pulseaudio flag
test "Map unmapped variant":
let mapper = newVariantMapper()
let flag = mapper.mapToSource("test", "unknown", "value", "nix")
check flag == ""
test "Map all variants - all mapped":
let mapper = newVariantMapper()
var variants = initTable[string, seq[string]]()
variants["graphics"] = @["wayland", "vulkan"]
variants["audio"] = @["pipewire"]
let (flags, unmapped) = mapper.mapAllVariants("firefox", variants, "nix")
check flags.len == 3
check unmapped.len == 0
check "waylandSupport = true" in flags
check "vulkanSupport = true" in flags
check "pipewireSupport = true" in flags
test "Map all variants - some unmapped":
let mapper = newVariantMapper()
var variants = initTable[string, seq[string]]()
variants["graphics"] = @["wayland"]
variants["unknown"] = @["value"]
variants["another"] = @["unmapped"]
let (flags, unmapped) = mapper.mapAllVariants("test", variants, "nix")
check flags.len == 1
check unmapped.len == 2
check "waylandSupport = true" in flags
check "unknown=value" in unmapped
check "another=unmapped" in unmapped
test "Map all variants - empty input":
let mapper = newVariantMapper()
let variants = initTable[string, seq[string]]()
let (flags, unmapped) = mapper.mapAllVariants("test", variants, "nix")
check flags.len == 0
check unmapped.len == 0
test "Load custom mappings - valid JSON":
let mapper = newVariantMapper()
# Create a temporary JSON file
let tempFile = getTempDir() / "test-mappings.json"
let jsonContent = %*{
"mypackage": {
"feature": {
"enabled": {
"nix": "enableFeature = true",
"pkgsrc": "feature",
"gentoo": "feature",
"description": "Enable feature"
}
}
}
}
writeFile(tempFile, jsonContent.pretty())
mapper.loadCustomMappings(tempFile)
check mapper.customMappings.len == 1
let flag = mapper.mapToSource("mypackage", "feature", "enabled", "nix")
check flag == "enableFeature = true"
# Cleanup
removeFile(tempFile)
test "Load custom mappings - non-existent file":
let mapper = newVariantMapper()
# Should not crash
mapper.loadCustomMappings("/non/existent/file.json")
check mapper.customMappings.len == 0
test "Load custom mappings - invalid JSON":
let mapper = newVariantMapper()
let tempFile = getTempDir() / "invalid-mappings.json"
writeFile(tempFile, "{ invalid json }")
# Should not crash
mapper.loadCustomMappings(tempFile)
check mapper.customMappings.len == 0
# Cleanup
removeFile(tempFile)
test "Custom mapping precedence over generic":
let mapper = newVariantMapper()
# Create custom mapping that overrides generic
let tempFile = getTempDir() / "override-mappings.json"
let jsonContent = %*{
"firefox": {
"graphics": {
"wayland": {
"nix": "customWaylandFlag = true",
"pkgsrc": "custom-wayland",
"gentoo": "custom-wayland",
"description": "Custom wayland"
}
}
}
}
writeFile(tempFile, jsonContent.pretty())
mapper.loadCustomMappings(tempFile)
let flag = mapper.mapToSource("firefox", "graphics", "wayland", "nix")
# Should use custom mapping, not generic
check flag == "customWaylandFlag = true"
# Cleanup
removeFile(tempFile)
test "Multiple packages in custom mappings":
let mapper = newVariantMapper()
let tempFile = getTempDir() / "multi-mappings.json"
let jsonContent = %*{
"package1": {
"domain1": {
"value1": {
"nix": "flag1 = true",
"pkgsrc": "flag1",
"gentoo": "flag1"
}
}
},
"package2": {
"domain2": {
"value2": {
"nix": "flag2 = true",
"pkgsrc": "flag2",
"gentoo": "flag2"
}
}
}
}
writeFile(tempFile, jsonContent.pretty())
mapper.loadCustomMappings(tempFile)
check mapper.customMappings.len == 2
let flag1 = mapper.mapToSource("package1", "domain1", "value1", "nix")
let flag2 = mapper.mapToSource("package2", "domain2", "value2", "nix")
check flag1 == "flag1 = true"
check flag2 == "flag2 = true"
# Cleanup
removeFile(tempFile)
test "Case sensitivity in package names":
let mapper = newVariantMapper()
# Package-specific mappings use lowercase
let flag1 = mapper.mapToSource("Firefox", "graphics", "wayland", "nix")
let flag2 = mapper.mapToSource("firefox", "graphics", "wayland", "nix")
let flag3 = mapper.mapToSource("FIREFOX", "graphics", "wayland", "nix")
# All should map to the same thing (lowercase is used internally)
check flag1 == flag2
check flag2 == flag3
test "Multiple values in same domain":
let mapper = newVariantMapper()
var variants = initTable[string, seq[string]]()
variants["graphics"] = @["wayland", "vulkan", "X"]
let (flags, unmapped) = mapper.mapAllVariants("test", variants, "nix")
check flags.len == 3
check unmapped.len == 0
check "waylandSupport = true" in flags
check "vulkanSupport = true" in flags
check "x11Support = true" in flags
test "Different sources produce different flags":
let mapper = newVariantMapper()
var variants = initTable[string, seq[string]]()
variants["graphics"] = @["wayland"]
let (nixFlags, _) = mapper.mapAllVariants("test", variants, "nix")
let (pkgsrcFlags, _) = mapper.mapAllVariants("test", variants, "pkgsrc")
let (gentooFlags, _) = mapper.mapAllVariants("test", variants, "gentoo")
check nixFlags.len == 1
check pkgsrcFlags.len == 1
check gentooFlags.len == 1
check nixFlags[0] == "waylandSupport = true"
check pkgsrcFlags[0] == "wayland"
check gentooFlags[0] == "wayland"
test "Optimization domain mappings":
let mapper = newVariantMapper()
var variants = initTable[string, seq[string]]()
variants["optimization"] = @["lto", "pgo"]
let (flags, unmapped) = mapper.mapAllVariants("test", variants, "nix")
check flags.len == 2
check unmapped.len == 0
check "enableLTO = true" in flags
check "enablePGO = true" in flags
test "Security domain mappings":
let mapper = newVariantMapper()
var variants = initTable[string, seq[string]]()
variants["security"] = @["pie", "hardened"]
let (flags, unmapped) = mapper.mapAllVariants("test", variants, "gentoo")
check flags.len == 2
check unmapped.len == 0
check "pie" in flags
check "hardened" in flags
test "Audio domain mappings":
let mapper = newVariantMapper()
var variants = initTable[string, seq[string]]()
variants["audio"] = @["pipewire", "pulseaudio", "alsa"]
let (flags, unmapped) = mapper.mapAllVariants("test", variants, "pkgsrc")
check flags.len == 3
check unmapped.len == 0
check "pipewire" in flags
check "pulseaudio" in flags
check "alsa" in flags