feat: string context

This commit is contained in:
2026-01-17 18:13:44 +08:00
parent 513b43965c
commit 52bf46407a
7 changed files with 266 additions and 22 deletions

View File

@@ -288,3 +288,92 @@ fn interpolation_derivation_equals_tostring() {
);
assert_eq!(result, Value::Bool(true));
}
#[test]
fn substring_preserves_context() {
let result = eval(
r#"
let
drv = derivation { name = "test"; builder = "/bin/sh"; system = "x86_64-linux"; };
str = builtins.toString drv;
sub = builtins.substring 0 10 str;
in builtins.hasContext sub
"#,
);
assert_eq!(result, Value::Bool(true));
}
#[test]
fn substring_zero_length_preserves_context() {
let result = eval(
r#"
let
drv = derivation { name = "test"; builder = "/bin/sh"; system = "x86_64-linux"; };
str = builtins.toString drv;
empty = builtins.substring 0 0 str;
in builtins.hasContext empty
"#,
);
assert_eq!(result, Value::Bool(true));
}
#[test]
fn substring_zero_length_empty_value() {
let result = eval(
r#"
let
drv = derivation { name = "test"; builder = "/bin/sh"; system = "x86_64-linux"; };
str = builtins.toString drv;
empty = builtins.substring 0 0 str;
in empty == ""
"#,
);
assert_eq!(result, Value::Bool(true));
}
#[test]
fn concatStringsSep_preserves_context() {
let result = eval(
r#"
let
drv1 = derivation { name = "test1"; builder = "/bin/sh"; system = "x86_64-linux"; };
drv2 = derivation { name = "test2"; builder = "/bin/sh"; system = "x86_64-linux"; };
str1 = builtins.toString drv1;
str2 = builtins.toString drv2;
combined = builtins.concatStringsSep ":" [str1 str2];
in builtins.hasContext combined
"#,
);
assert_eq!(result, Value::Bool(true));
}
#[test]
fn concatStringsSep_merges_contexts() {
let result = eval(
r#"
let
drv1 = derivation { name = "test1"; builder = "/bin/sh"; system = "x86_64-linux"; };
drv2 = derivation { name = "test2"; builder = "/bin/sh"; system = "x86_64-linux"; };
str1 = builtins.toString drv1;
str2 = builtins.toString drv2;
combined = builtins.concatStringsSep ":" [str1 str2];
ctx = builtins.getContext combined;
in builtins.length (builtins.attrNames ctx)
"#,
);
assert_eq!(result, Value::Int(2));
}
#[test]
fn concatStringsSep_separator_has_context() {
let result = eval(
r#"
let
drv = derivation { name = "test"; builder = "/bin/sh"; system = "x86_64-linux"; };
sep = builtins.toString drv;
combined = builtins.concatStringsSep sep ["a" "b"];
in builtins.hasContext combined
"#,
);
assert_eq!(result, Value::Bool(true));
}