nip/tests/test_variant_cli.nim

117 lines
4.0 KiB
Nim

## test_variant_cli.nim
## Tests for variant CLI commands (diff and explain)
import std/[unittest, tables, strutils]
import ../src/nimpak/variant_domains
import ../src/nimpak/variant_compiler
suite "Variant CLI Commands - Domain and Compiler Rules":
test "Variant explain command validates domain existence":
# Test that SEMANTIC_DOMAINS contains expected domains
check SEMANTIC_DOMAINS.hasKey("init")
check SEMANTIC_DOMAINS.hasKey("graphics")
check SEMANTIC_DOMAINS.hasKey("security")
check SEMANTIC_DOMAINS.hasKey("optimization")
check SEMANTIC_DOMAINS.hasKey("runtime")
test "Variant explain command shows domain description":
# Verify domain info is accessible
let initDomain = SEMANTIC_DOMAINS["init"]
check initDomain.description.len > 0
check initDomain.options.len > 0
test "Variant explain command shows flag options":
# Verify flag options are available
let securityDomain = SEMANTIC_DOMAINS["security"]
check "pie" in securityDomain.options
check "relro" in securityDomain.options
check "hardened" in securityDomain.options
test "Variant explain command shows compiler flag effects":
# Verify compiler flag rules exist
check COMPILER_FLAG_RULES.hasKey("security")
check COMPILER_FLAG_RULES.hasKey("optimization")
let securityRules = COMPILER_FLAG_RULES["security"]
check securityRules.hasKey("pie")
check securityRules.hasKey("relro")
let pieRule = securityRules["pie"]
check pieRule.cflags.len > 0
check pieRule.ldflags.len > 0
test "Variant explain command handles invalid domain":
# Test that invalid domain is detected
check not SEMANTIC_DOMAINS.hasKey("invalid-domain")
test "Variant explain command handles invalid flag":
# Test that invalid flag in valid domain is detected
let securityDomain = SEMANTIC_DOMAINS["security"]
check "invalid-flag" notin securityDomain.options
test "Variant explain command shows exclusive domain info":
# Test exclusive domain detection
let initDomain = SEMANTIC_DOMAINS["init"]
check initDomain.exclusive == true
let securityDomain = SEMANTIC_DOMAINS["security"]
check securityDomain.exclusive == false
test "Variant explain command shows default values":
# Test default value display
let initDomain = SEMANTIC_DOMAINS["init"]
check initDomain.default.len > 0
check initDomain.default in initDomain.options
test "Variant diff logic - domain comparison":
# Test the logic that would be used in diff command
let domains1 = {
"init": @["dinit"],
"graphics": @["wayland"],
"security": @["pie", "relro"]
}.toTable
let domains2 = {
"init": @["systemd"],
"graphics": @["wayland"],
"security": @["hardened"],
"optimization": @["lto"]
}.toTable
# Check for added domains
var addedDomains: seq[string] = @[]
for domain in domains2.keys:
if not domains1.hasKey(domain):
addedDomains.add(domain)
check "optimization" in addedDomains
# Check for removed domains (none in this case)
var removedDomains: seq[string] = @[]
for domain in domains1.keys:
if not domains2.hasKey(domain):
removedDomains.add(domain)
check removedDomains.len == 0
# Check for changed domains
var changedDomains: seq[string] = @[]
for domain in domains1.keys:
if domains2.hasKey(domain):
if domains1[domain] != domains2[domain]:
changedDomains.add(domain)
check "init" in changedDomains
check "security" in changedDomains
check "graphics" notin changedDomains # unchanged
test "Compiler flag rule structure":
# Verify the structure of compiler flag rules
let optimizationRules = COMPILER_FLAG_RULES["optimization"]
check optimizationRules.hasKey("lto")
check optimizationRules.hasKey("march-native")
check optimizationRules.hasKey("pgo")
let ltoRule = optimizationRules["lto"]
check ltoRule.condition == "lto"
check "lto" in ltoRule.cflags
check "lto" in ltoRule.ldflags