All files

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
  }
]