Nasal Unit Testing Framework: Difference between revisions

Jump to navigation Jump to search
m
Fix up our coding :)
m (→‎Wrapping dependencies: testing sanitize())
m (Fix up our coding :))
Line 89: Line 89:
Wrapping APIs is simple to do in Nasal, too - without even requiring C/C++ changes, a standalone testbed could be scripted in Nasal like this:
Wrapping APIs is simple to do in Nasal, too - without even requiring C/C++ changes, a standalone testbed could be scripted in Nasal like this:
<syntaxhighlight lang="php">
<syntaxhighlight lang="php">
var tree = {};
var tree = {};
var isalpha = func(n) n >= `a` and n <= `z` or n >= `A` and n <= `Z`;
var isdigit = func(n) n >= `0` and n <= `9`;


var sanitize = func(p) {
var sanitize = func(p) {
     if (!p) die();
     if (!p) die();
     parts = split(p, "/");
    if (p[0] == `/`) p = substr(p, 1, nil);
     parts = split("/", p);
     for (var i=0; i<size(parts); i+=1) {
     for (var i=0; i<size(parts); i+=1) {
         if (parts[i] == "") {
         if (parts[i] == "") {
             parts = parts[:i-1] ~ parts[i+1:];
             if (i == size(parts)-1)
                parts = parts[:i-1];
            else parts = parts[:i-1] ~ parts[i+1:];
             i-=1;
             i-=1;
        } else {
            for (var j=0; j<size(parts[i]); j+=1) {
                if (parts[i][j] == `[`) break;
                if (parts[i][j] != `-` and !isalpha(parts[i][j]) and
                    parts[i][j] != `_` and !isdigit(parts[i][j]) and
                    parts[i][j] != `.`) die("bad character in name "~parts[i]~" at index "~j~".");
            }
            if (j == size(parts[i]))
                parts[i] ~= "[0]";
            elsif (parts[i][-1] != `]`) die("bad index specifier in string "~parts[i]~".")
         }
         }
        for (j=0; j<size(parts[i]); j+=1)
            if (parts[i][j] == "[") break;
            if (parts[i][j] != `-` and !isalpha(parts[i][j]) and
                parts[i][j] != `_` and !isdigit(parts[i][j]) and
                parts[i][j] != `.`) die("bad character in name "~parts[i]~" at index "~j);
        if (j == size(parts[i]))
            parts[i] ~= "[0]";
        elsif (parts[i][-1] != "]") die("bad index specifier")
     }
     }
     var p = "/";
     var p = "/";
Line 113: Line 122:
     return p;
     return p;
}
}
 
# wrappers for the FG setprop/getprop APIs:
# wrappers for the FG setprop/getprop APIs:
var setprop = func(p, value) tree[ sanitize(p) ] = value;
var setprop = func(p, value) tree[ sanitize(p) ] = value;
var getprop = func(p) return tree[ sanitize(p) ];
var getprop = func(p) return tree[ sanitize(p) ];
 
# some tests:
# some tests:


var path = ["/foo/bar", "/foo[0]/bar[0]","/foo[0]/bar[0]/", "/foo/bar[0]","/foo[0]/bar/","/foo[0]/bar/"]
var path = ["/foo/bar", "/foo[0]/bar[0]","/foo[0]/bar[0]/", "/foo/bar[0]","/foo[0]/bar/","/foo[0]/bar/"];
var value = "MyUniqueValue";
var value = "MyUniqueValue";
setprop(path, value);
setprop(path[0], value);
foreach(var p; path)
foreach(var p; path)
   if (p != value) die("sanitize() implementation is broken");
   if (getprop(p) != value) die("sanitize() implementation is broken");
print("sanitize() looks good!\n");
print("sanitize() looks good!\n");


395

edits

Navigation menu