src/stdlib/testing_files.panack
Green: covered; red: known zero; amber: unavailable. Blank lines are outside the executable-start-line denominator.
1 import "filesystem.panack" 2 3 // The caller owns this unique temporary directory and all files created in it. 4 record TestWorkspace { root: Path } 5 6 test_workspace_create(parent: Path): Result[TestWorkspace,HostError] { 7 match fs_temp_directory(parent) { 8 Ok(root) => Ok(TestWorkspace(root)), 9 Error(error) => Error(error) 10 } 11 } 12 13 // Refuse to discard a workspace that still contains fixtures or output. 14 test_workspace_remove_empty(workspace: TestWorkspace): Result[Unit,HostError] { 15 fs_remove_directory(workspace.root) 16 } 17 18 // Discover immediate directory children in fs_list's native-byte sorted order. 19 // Symlinks are not followed. A filesystem error aborts discovery without a 20 // partial result; fs_list guarantees child names are relative. 21 test_discover_fixtures(root: Path): Result[[Path],HostError] { 22 match fs_list(root) { 23 Error(error) => Error(error), 24 Ok(names) => { 25 mut fixtures: [Path] = [] 26 mut failure: Option[HostError] = None() 27 for name in names { 28 match failure { 29 Some(problem) => {}, 30 None() => { 31 match path_append(root, name) { 32 Error(path_error) => { 33 failure = Some(HostError("test_discover_fixtures", "invalid_argument", 0)) 34 }, 35 Ok(child) => { 36 match fs_metadata(child) { 37 Error(error) => { failure = Some(error) }, 38 Ok(metadata) => { 39 if metadata.kind == Directory() { 40 fixtures = fixtures.append(child) 41 } 42 } 43 } 44 } 45 } 46 } 47 } 48 } 49 match failure { 50 Some(error) => Error(error), 51 None() => Ok(fixtures) 52 } 53 } 54 } 55 } 56
Functions
[
{
"id": "declaration/2",
"name": "test_workspace_create",
"line": 6,
"state": "zero",
"entries": "0"
},
{
"id": "declaration/3",
"name": "test_workspace_remove_empty",
"line": 14,
"state": "zero",
"entries": "0"
},
{
"id": "declaration/4",
"name": "test_discover_fixtures",
"line": 21,
"state": "zero",
"entries": "0"
}
]Source branch outcomes
[
{
"id": "declaration/2/tail/arm/0",
"outcome": "Ok",
"line": 8,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/2/tail/arm/1",
"outcome": "Error",
"line": 9,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/4/tail/arm/0",
"outcome": "Error",
"line": 23,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/4/tail/arm/1",
"outcome": "Ok",
"line": 24,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/4/tail/arm/1/body/block/statement/2/decision/body",
"outcome": "body",
"line": 27,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/4/tail/arm/1/body/block/statement/2/decision/exit",
"outcome": "exit",
"line": 27,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/4/tail/arm/1/body/block/statement/2/body/tail/arm/0",
"outcome": "Some",
"line": 29,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/4/tail/arm/1/body/block/statement/2/body/tail/arm/1",
"outcome": "None",
"line": 30,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/4/tail/arm/1/body/block/statement/2/body/tail/arm/1/body/block/tail/arm/0",
"outcome": "Error",
"line": 32,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/4/tail/arm/1/body/block/statement/2/body/tail/arm/1/body/block/tail/arm/1",
"outcome": "Ok",
"line": 35,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/4/tail/arm/1/body/block/statement/2/body/tail/arm/1/body/block/tail/arm/1/body/block/tail/arm/0",
"outcome": "Error",
"line": 37,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/4/tail/arm/1/body/block/statement/2/body/tail/arm/1/body/block/tail/arm/1/body/block/tail/arm/1",
"outcome": "Ok",
"line": 38,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/4/tail/arm/1/body/block/statement/2/body/tail/arm/1/body/block/tail/arm/1/body/block/tail/arm/1/body/block/tail/decision/true",
"outcome": "true",
"line": 39,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/4/tail/arm/1/body/block/statement/2/body/tail/arm/1/body/block/tail/arm/1/body/block/tail/arm/1/body/block/tail/decision/false",
"outcome": "false",
"line": 39,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/4/tail/arm/1/body/block/tail/arm/0",
"outcome": "Some",
"line": 50,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/4/tail/arm/1/body/block/tail/arm/1",
"outcome": "None",
"line": 51,
"state": "zero",
"hits": "0"
}
]Reviewed declaration exclusions
[
{
"id": "declaration/0",
"reason": "import",
"line": 1
},
{
"id": "declaration/1",
"reason": "record-declaration",
"line": 4
}
]