World Conquest Chronicles

World Conquest Chronicles

go-code-runner, v1.2

The library that implements the compiling and running of a code written in the Go programming language and running of a test case set for the compiled code (i.e. the executable file).

Checking of package imports used in the code written in the Go programming language.

Change Log

  • checking of package imports used in the code written in the Go programming language:
    • checking based on the list of allowed imports;
  • compiling of a code written in the Go programming language:
    • checking of package imports used in the code (optionally):
      • checking based on the list of allowed imports.

Features

  • saving of a code to a temporary file:
    • storing of the temporary file with the code to an individual temporary directory;
  • checking of package imports used in the code written in the Go programming language:
    • checking based on the list of allowed imports;
  • compiling of a code written in the Go programming language:
    • automatic importing of the packages used in the code;
    • checking of package imports used in the code (optionally):
      • checking based on the list of allowed imports;
    • enriching of an error of the external command running by an output from the stderr stream;
  • running of the compiled code (i.e. the executable file):
    • passing of a custom input as the stdin stream;
    • returning of an output from the stdout stream;
    • enriching of an error of the external command running by an output from the stderr stream;
  • running of a test case set for the compiled code (i.e. the executable file):
    • representation of a test case:
      • input;
      • expected output;
    • checking of an actual output in each test case:
      • returning of the sentinel errors:
        • failed running — it returns on a running error;
        • unexpected output — it returns when the expected and actual outputs do not match.

Examples

coderunner.CheckImports (success):

package main

import (
    "fmt"
    "log"
    "os"
    "path/filepath"

    coderunner "github.com/thewizardplusplus/go-code-runner"
)

func main() {
    const code = `
        package main

        import (
            "fmt"
            "log"
        )

        func main() {
            var x, y int
            if _, err := fmt.Scan(&x, &y); err != nil {
                log.Fatal(err)
            }

            fmt.Println(x + y)
        }
    `

    pathToCode, err := coderunner.SaveTemporaryCode(code)
    if err != nil {
        log.Fatal(err)
    }
    defer os.RemoveAll(filepath.Dir(pathToCode)) // nolint: errcheck

    err = coderunner.CheckImports(pathToCode, []string{"fmt", "log"})
    fmt.Printf("%v\n", err)

    // Output:
    // <nil>
}

coderunner.CheckImports (error):

package main

import (
    "fmt"
    "log"
    "os"
    "path/filepath"

    coderunner "github.com/thewizardplusplus/go-code-runner"
)

func main() {
    const code = `
        package main

        import (
            "fmt"
            "log"
        )

        func main() {
            var x, y int
            if _, err := fmt.Scan(&x, &y); err != nil {
                log.Fatal(err)
            }

            fmt.Println(x + y)
        }
    `

    pathToCode, err := coderunner.SaveTemporaryCode(code)
    if err != nil {
        log.Fatal(err)
    }
    defer os.RemoveAll(filepath.Dir(pathToCode)) // nolint: errcheck

    err = coderunner.CheckImports(pathToCode, []string{"fmt"})
    fmt.Printf("%v\n", err)

    // Output:
    // disallowed import "log"
}

Repository

Link: https://github.com/thewizardplusplus/go-code-runner/tree/v1.2.

Content: code.

License: MIT.