nip/test_kdl_parser.nim

129 lines
3.6 KiB
Nim

## Test KDL Parser with NIP configuration
import src/nimpak/kdl_parser
import std/[options, strformat]
proc testBasicParsing() =
echo "=== Testing Basic KDL Parsing ==="
let kdlContent = """
nip {
programs-dir "/Programs"
links-dir "/System/Links"
auto-symlink true
verbose false
}
"""
let doc = parseKdlString(kdlContent)
echo fmt"✓ Parsed {doc.len} top-level nodes"
let nipNode = doc.findNode("nip")
if nipNode.isSome:
let node = nipNode.get
echo fmt"✓ Found 'nip' node with {node.children.len} children"
# Access properties
if node.hasProp("programs-dir"):
let progDir = node.getPropString("programs-dir")
echo fmt" programs-dir: {progDir}"
if node.hasProp("auto-symlink"):
let autoLink = node.getPropBool("auto-symlink")
echo fmt" auto-symlink: {autoLink}"
proc testFileParsing() =
echo "\n=== Testing File Parsing ==="
try:
let doc = parseKdlFile("examples/nip-config-kdl-valid.kdl")
echo fmt"✓ Parsed examples/nip-config-kdl-valid.kdl: {doc.len} top-level nodes"
let nipNode = doc.findNode("nip")
if nipNode.isSome:
let node = nipNode.get
echo fmt"✓ Found 'nip' node with {node.children.len} children"
# Find use-flags section
let useFlagsNode = node.findChild("use-flags")
if useFlagsNode.isSome:
let flags = useFlagsNode.get
echo fmt"✓ Found 'use-flags' section with {flags.children.len} categories"
# List some categories
for i, category in flags.children:
if i < 5: # Show first 5
echo fmt" - {category.name}: {category.children.len} flags"
# Find profiles section
let profilesNode = node.findChild("profiles")
if profilesNode.isSome:
let profiles = profilesNode.get
echo fmt"✓ Found 'profiles' section"
# Find specific profiles
let perfProfile = profiles.findChild("profile")
if perfProfile.isSome:
echo " Found profile definitions"
# Find package configurations
let packages = node.findChildren("package")
echo fmt"✓ Found {packages.len} package configurations"
for i, pkg in packages:
if i < 3 and pkg.args.len > 0: # Show first 3
let pkgName = pkg.getArgString(0)
echo fmt" - {pkgName}"
except IOError as e:
echo fmt"⚠ Could not read file: {e.msg}"
except ValueError as e:
echo fmt"✗ Parse error: {e.msg}"
proc testNestedStructures() =
echo "\n=== Testing Nested Structures ==="
let kdlContent = """
package "firefox" {
description "Firefox web browser"
use-flags {
+wayland
-X
+lto
}
compiler {
CFLAGS "-O3 -march=native"
MAKEFLAGS "-j8"
}
}
"""
let doc = parseKdlString(kdlContent)
let pkgNode = doc.findNode("package")
if pkgNode.isSome:
let pkg = pkgNode.get
let pkgName = pkg.getArgString(0)
echo fmt"✓ Package: {pkgName}"
let descNode = pkg.findChild("description")
if descNode.isSome and descNode.get.args.len > 0:
echo fmt" Description: {descNode.get.getArgString(0)}"
let useFlagsNode = pkg.findChild("use-flags")
if useFlagsNode.isSome:
echo fmt" USE flags: {useFlagsNode.get.children.len} flags defined"
let compilerNode = pkg.findChild("compiler")
if compilerNode.isSome:
echo fmt" Compiler settings: {compilerNode.get.children.len} options"
when isMainModule:
echo "KDL Parser Test Suite for NIP\n"
testBasicParsing()
testFileParsing()
testNestedStructures()
echo "\n✅ All tests completed!"