toml: update the alexcrichton and BurntSushi repos to their successors toml-rs, and toml-test, record new exceptions (#21152)

This commit is contained in:
Delyan Angelov 2024-04-01 22:03:35 +03:00 committed by GitHub
parent 5da1fccaed
commit ef48fb60c6
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 143 additions and 105 deletions

View File

@ -0,0 +1,16 @@
#!/usr/bin/env bash
set -ex
rm -rf vlib/toml/tests/testdata/burntsushi vlib/toml/tests/testdata/iarna vlib/toml/tests/testdata/alexcrichton vlib/toml/tests/testdata/large_toml_file_test.toml
.github/workflows/retry.sh wget https://gist.githubusercontent.com/Larpon/89b0e3d94c6903851ff15559e5df7a05/raw/62a1f87a4e37bf157f2e0bfb32d85d840c98e422/large_toml_file_test.toml -O vlib/toml/tests/testdata/large_toml_file_test.toml
.github/workflows/retry.sh git clone -n https://github.com/iarna/toml-spec-tests.git vlib/toml/tests/testdata/iarna
git -C vlib/toml/tests/testdata/iarna checkout 1880b1a
.github/workflows/retry.sh git clone -n https://github.com/toml-lang/toml-test.git vlib/toml/tests/testdata/burntsushi
git -C vlib/toml/tests/testdata/burntsushi checkout f30c716
.github/workflows/retry.sh git clone -n https://github.com/toml-rs/toml.git vlib/toml/tests/testdata/alexcrichton
git -C vlib/toml/tests/testdata/alexcrichton reset --hard 499e8c4

View File

@ -13,61 +13,20 @@ jobs:
runs-on: ubuntu-latest
if: github.event_name != 'push' || github.event.ref == 'refs/heads/master' || github.event.repository.full_name != 'vlang/v'
timeout-minutes: 30
env:
TOML_BS_TESTS_PATH: vlib/toml/tests/testdata/burntsushi/toml-test
TOML_BS_TESTS_PINNED_COMMIT: 4634fdf
TOML_IARNA_TESTS_PATH: vlib/toml/tests/testdata/iarna/toml-test
TOML_IARNA_TESTS_PINNED_COMMIT: 1880b1a
TOML_AC_TESTS_PATH: vlib/toml/tests/testdata/alexcrichton/toml-test
TOML_AC_TESTS_PINNED_COMMIT: 499e8c4
VTEST_TOML_DO_LARGE_FILES: 1
VTEST_TOML_DO_YAML_CONVERSION: 1
steps:
- uses: actions/checkout@v4
- name: Install dependencies
run: |
.github/workflows/retry.sh sudo apt-get update
.github/workflows/retry.sh sudo apt-get install --quiet -y jq libgc-dev
- name: Build V
run: make -j2 && ./v -cc gcc -o v cmd/v
run: make
- name: Show JQ Version
run: jq --version
- name: Run local TOML tests
run: ./v test vlib/toml
- name: Download more TOML testsuits
run: .github/workflows/download_full_toml_test_suites.sh
# Tests found at https://github.com/BurntSushi/toml-test
- name: Clone BurntSushi/toml-test
run: |
.github/workflows/retry.sh git clone -n https://github.com/BurntSushi/toml-test.git $TOML_BS_TESTS_PATH
.github/workflows/retry.sh git -C $TOML_BS_TESTS_PATH checkout $TOML_BS_TESTS_PINNED_COMMIT
- name: Run BurntSushi TOML tests
run: ./v vlib/toml/tests/burntsushi_toml_test.v
# Tests found at gist
- name: Get large_toml_file_test.toml
run: .github/workflows/retry.sh wget https://gist.githubusercontent.com/Larpon/89b0e3d94c6903851ff15559e5df7a05/raw/62a1f87a4e37bf157f2e0bfb32d85d840c98e422/large_toml_file_test.toml -O vlib/toml/tests/testdata/large_toml_file_test.toml
- name: Run large TOML file tests
run: ./v vlib/toml/tests/large_toml_file_test.v
# Tests found at https://github.com/iarna/toml-spec-tests
- name: Clone iarna/toml-spec-tests
run: |
.github/workflows/retry.sh git clone -n https://github.com/iarna/toml-spec-tests.git $TOML_IARNA_TESTS_PATH
git -C $TOML_IARNA_TESTS_PATH checkout $TOML_IARNA_TESTS_PINNED_COMMIT
- name: Run iarna TOML tests
run: ./v -gc boehm vlib/toml/tests/iarna_toml_spec_test.v
# Tests found at https://github.com/alexcrichton/toml-rs
- name: Clone alexcrichton/toml-rs
run: |
.github/workflows/retry.sh git clone -n https://github.com/alexcrichton/toml-rs.git $TOML_AC_TESTS_PATH
git -C $TOML_AC_TESTS_PATH checkout $TOML_AC_TESTS_PINNED_COMMIT
- name: Run alexcrichton TOML tests
run: ./v vlib/toml/tests/alexcrichton_toml_rs_test.v
- name: Run TOML tests
run: VTEST_TOML_DO_YAML_CONVERSION=1 VTEST_TOML_DO_LARGE_FILES=1 ./v test vlib/toml

View File

@ -4,10 +4,12 @@ import toml.ast
import x.json2
const hide_oks = os.getenv('VTEST_HIDE_OK') == '1'
const no_jq = os.getenv('VNO_JQ') == '1'
// Instructions for developers:
// The actual tests and data can be obtained by doing:
// `git clone --depth 1 https://github.com/alexcrichton/toml-rs.git vlib/toml/tests/testdata/alexcrichton/toml-test`
// `git clone -n https://github.com/toml-rs/toml.git vlib/toml/tests/testdata/alexcrichton`
// `git -C vlib/toml/tests/testdata/alexcrichton reset --hard 499e8c4`
// See also the CI toml tests
// Kept for easier handling of future updates to the tests
const valid_exceptions = [
@ -62,11 +64,11 @@ fn run(args []string) !string {
// test_alexcrichton_toml_rs run though 'testdata/alexcrichton/toml-test/test-suite/tests/*' if found.
fn test_alexcrichton_toml_rs() {
this_file := @FILE
test_root := os.join_path(os.dir(this_file), 'testdata', 'alexcrichton', 'toml-test')
eprintln('> running ${@LOCATION}')
test_root := '${@VROOT}/vlib/toml/tests/testdata/alexcrichton/test-suite/tests'
if os.is_dir(test_root) {
valid_test_files := os.walk_ext(os.join_path(test_root, 'test-suite', 'tests',
'valid'), '.toml')
valid_test_files := os.walk_ext(os.join_path(test_root, 'valid'), '.toml')
invalid_test_files := os.walk_ext(os.join_path(test_root, 'invalid'), '.toml')
println('Testing ${valid_test_files.len} valid TOML files...')
mut valid := 0
mut e := 0
@ -94,7 +96,7 @@ fn test_alexcrichton_toml_rs() {
}
// If the command-line tool `jq` is installed, value tests can be run as well.
if jq != '' {
if jq != '' && !no_jq {
println('Testing value output of ${valid_test_files.len} valid TOML files using "${jq}"...')
if os.exists(compare_work_dir_root) {
@ -171,8 +173,6 @@ fn test_alexcrichton_toml_rs() {
}
}
invalid_test_files := os.walk_ext(os.join_path(test_root, 'test-suite', 'tests',
'invalid'), '.toml')
println('Testing ${invalid_test_files.len} invalid TOML files...')
mut invalid := 0
e = 0

View File

@ -1,29 +1,83 @@
// vtest flaky: true
// vtest retry: 3
// Instructions for developers:
// The actual tests and data can be obtained by doing:
// `git clone -n https://github.com/toml-lang/toml-test.git vlib/toml/tests/testdata/burntsushi`
// `git -C vlib/toml/tests/testdata/burntsushi reset --hard f30c716
// See also the CI toml tests
import os
import toml
import toml.ast
import x.json2
const hide_oks = os.getenv('VTEST_HIDE_OK') == '1'
const no_jq = os.getenv('VNO_JQ') == '1'
// Instructions for developers:
// The actual tests and data can be obtained by doing:
// `cd vlib/toml/tests/testdata`
// `git clone --depth 1 https://github.com/BurntSushi/toml-test.git burntsushi/toml-test`
// See also the CI toml tests
// Kept for easier handling of future updates to the tests
const valid_exceptions = [
'array/open-parent-table.toml',
'comment/after-literal-no-ws.toml',
'comment/everywhere.toml',
'datetime/no-seconds.toml',
'inline-table/newline.toml',
'key/space.toml',
'key/start.toml',
'key/unicode.toml',
'string/escapes.toml',
'string/escape-esc.toml',
'string/hex-escape.toml',
'string/multiline-escaped-crlf.toml',
'string/multiline-quotes.toml',
'table/array-implicit-and-explicit-after.toml',
'table/array-within-dotted.toml',
]
const jq_not_equal = [
'do_not_remove',
'datetime/milliseconds.toml',
'float/zero.toml',
'inline-table/spaces.toml',
'spec/array-of-tables-1.toml',
'spec/float-0.toml',
'spec/float-2.toml',
]
const invalid_exceptions = [
'array/only-comma-1.toml',
'control/bare-cr.toml',
'datetime/hour-over.toml',
'datetime/mday-under.toml',
'datetime/minute-over.toml',
'datetime/month-under.toml',
'datetime/second-over.toml',
'datetime/feb-29.toml',
'datetime/feb-30.toml',
'inline-table/duplicate-key-2.toml',
'inline-table/duplicate-key-3.toml',
'inline-table/overwrite-2.toml',
'inline-table/overwrite-4.toml',
'inline-table/overwrite-5.toml',
'inline-table/overwrite-8.toml',
'local-date/feb-29.toml',
'local-date/feb-30.toml',
'local-date/mday-under.toml',
'local-date/month-under.toml',
'local-datetime/feb-29.toml',
'local-datetime/feb-30.toml',
'local-datetime/hour-over.toml',
'local-datetime/mday-under.toml',
'local-datetime/minute-over.toml',
'local-datetime/month-under.toml',
'local-datetime/second-over.toml',
'local-time/hour-over.toml',
'local-time/minute-over.toml',
'local-time/second-over.toml',
'string/multiline-escape-space-2.toml',
'table/duplicate-key-dotted-array.toml',
'table/redefine-2.toml',
]
const valid_value_exceptions = [
'do_not_remove',
]
const valid_value_exceptions = []string{}
// BUG with string interpolation of '${i64(-9223372036854775808)}') see below for workaround
//'integer/long.toml', // TODO: https://github.com/vlang/v/issues/9507
@ -54,36 +108,40 @@ fn run(args []string) !string {
// test_burnt_sushi_tomltest run though 'testdata/burntsushi/toml-test/*' if found.
fn test_burnt_sushi_tomltest() {
this_file := @FILE
test_root := os.join_path(os.dir(this_file), 'testdata', 'burntsushi', 'toml-test',
'tests')
eprintln('> running ${@LOCATION}')
test_root := '${@VROOT}/vlib/toml/tests/testdata/burntsushi/tests'
if !os.is_dir(test_root) {
println('No test data directory found in "${test_root}"')
assert true
return
}
valid_folder := os.join_path('toml-test', 'tests', 'valid')
invalid_folder := os.join_path('toml-test', 'tests', 'invalid')
valid_test_files := os.walk_ext(os.join_path(test_root, 'valid'), '.toml')
println('Testing ${valid_test_files.len} valid TOML files...')
valid_folder := 'valid'
valid_test_files := os.walk_ext('${test_root}/valid', '.toml').map(it.replace('\\',
'/')).sorted()
invalid_folder := 'invalid'
invalid_test_files := os.walk_ext('${test_root}/invalid', '.toml').map(it.replace('\\',
'/')).sorted()
//
println('\nTesting ${valid_test_files.len} valid TOML files...')
mut valid := 0
mut e := 0
for i, valid_test_file in valid_test_files {
mut relative := valid_test_file.all_after(valid_folder).trim_left(os.path_separator)
$if windows {
relative = relative.replace('/', '\\')
}
relative := valid_test_file.all_after(valid_folder).trim_left('/')
if relative in valid_exceptions {
e++
idx := valid_exceptions.index(relative) + 1
println('SKIP [${i + 1}/${valid_test_files.len}] "${valid_test_file}" VALID EXCEPTION [${idx}/${valid_exceptions.len}]...')
continue
}
// eprintln('>>> trying to parse: ${valid_test_file} | relative: $relative')
toml_doc := toml.parse_file(valid_test_file) or {
eprintln('>>> error while parsing: ${valid_test_file}')
panic(err)
}
valid++
if !hide_oks {
println('OK [${i + 1}/${valid_test_files.len}] "${valid_test_file}"...')
}
toml_doc := toml.parse_file(valid_test_file)!
valid++
}
println('${valid}/${valid_test_files.len} TOML files were parsed correctly')
if valid_exceptions.len > 0 {
@ -91,8 +149,8 @@ fn test_burnt_sushi_tomltest() {
}
// If the command-line tool `jq` is installed, value tests can be run as well.
if jq != '' {
println('Testing value output of ${valid_test_files.len} valid TOML files using "${jq}"...')
if jq != '' && !no_jq {
println('\nTesting value output of ${valid_test_files.len} valid TOML files using "${jq}"...')
if os.exists(compare_work_dir_root) {
os.rmdir_all(compare_work_dir_root)!
@ -105,10 +163,7 @@ fn test_burnt_sushi_tomltest() {
valid = 0
e = 0
for i, valid_test_file in valid_test_files {
mut relative := valid_test_file.all_after(valid_folder).trim_left(os.path_separator)
$if windows {
relative = relative.replace('/', '\\')
}
relative := valid_test_file.all_after(valid_folder).trim_left('/')
// Skip the file if we know it can't be parsed or we know that the value retrieval needs work.
if relative in valid_exceptions {
e++
@ -127,6 +182,7 @@ fn test_burnt_sushi_tomltest() {
println('OK [${i + 1}/${valid_test_files.len}] "${valid_test_file}"...')
}
toml_doc := toml.parse_file(valid_test_file)!
// eprintln(' relative: $relative parsed')
v_toml_json_path := os.join_path(compare_work_dir_root,
os.file_name(valid_test_file).all_before_last('.') + '.v.json')
@ -148,25 +204,34 @@ fn test_burnt_sushi_tomltest() {
panic(err.msg() + '\n${contents}')
}
assert bs_normalized_json == v_normalized_json
if relative in jq_not_equal {
e++
eprintln('>>> skipped: relative: ${relative} in jq_not_equal, bs_normalized_json != bs_normalized_json')
continue
}
if bs_normalized_json != v_normalized_json {
e++
eprintln('>>> error: relative: ${relative}, bs_normalized_json != bs_normalized_json')
continue
}
assert bs_normalized_json == v_normalized_json
valid++
}
} else {
println('> Skipping json conversion tests, since jq: ${jq} | no_jq: ${no_jq}')
}
println('${valid}/${valid_test_files.len} TOML files were parsed correctly and value checked')
if valid_value_exceptions.len > 0 {
println('TODO Skipped value checks of ${valid_value_exceptions.len} valid TOML files...')
}
invalid_test_files := os.walk_ext(os.join_path(test_root, 'invalid'), '.toml')
println('Testing ${invalid_test_files.len} invalid TOML files...')
println('\nTesting ${invalid_test_files.len} invalid TOML files...')
mut invalid := 0
e = 0
for i, invalid_test_file in invalid_test_files {
mut relative := invalid_test_file.all_after(invalid_folder).trim_left(os.path_separator)
$if windows {
relative = relative.replace('/', '\\')
}
relative := invalid_test_file.all_after(invalid_folder).trim_left('/')
if relative in invalid_exceptions {
e++
idx := invalid_exceptions.index(relative) + 1
@ -178,7 +243,7 @@ fn test_burnt_sushi_tomltest() {
}
if toml_doc := toml.parse_file(invalid_test_file) {
content_that_should_have_failed := os.read_file(invalid_test_file)!
println(' This TOML should have failed:\n${'-'.repeat(40)}\n${content_that_should_have_failed}\n${'-'.repeat(40)}')
println(' This TOML from relative: ${relative}, invalid_test_file: ${invalid_test_file}, should have failed:\n${'-'.repeat(100)}\n${content_that_should_have_failed}\n${'-'.repeat(100)}')
assert false
} else {
if !hide_oks {
@ -188,7 +253,7 @@ fn test_burnt_sushi_tomltest() {
}
invalid++
}
println('${invalid}/${invalid_test_files.len} TOML files were parsed correctly')
println('${invalid}/${invalid_test_files.len} invalid TOML files correctly had parsing errors')
if invalid_exceptions.len > 0 {
println('TODO Skipped parsing of ${invalid_exceptions.len} invalid TOML files...')
}

View File

@ -69,14 +69,14 @@ fn run(args []string) !string {
// test_iarna_toml_spec_tests run though 'testdata/iarna/toml-test/*' if found.
fn test_iarna_toml_spec_tests() {
this_file := @FILE
test_root := os.join_path(os.dir(this_file), 'testdata', 'iarna', 'toml-test')
test_root := os.join_path(os.dir(this_file), 'testdata', 'iarna')
if os.is_dir(test_root) {
valid_test_files := os.walk_ext(os.join_path(test_root, 'values'), '.toml')
println('Testing ${valid_test_files.len} valid TOML files...')
mut valid := 0
mut e := 0
for i, valid_test_file in valid_test_files {
mut relative := valid_test_file.all_after('toml-test').trim_left(os.path_separator)
mut relative := valid_test_file.all_after('iarna').trim_left(os.path_separator)
$if windows {
relative = relative.replace('/', '\\')
}
@ -120,7 +120,7 @@ fn test_iarna_toml_spec_tests() {
valid = 0
e = 0
for i, valid_test_file in valid_test_files {
mut relative := valid_test_file.all_after('toml-test').trim_left(os.path_separator)
mut relative := valid_test_file.all_after('iarna').trim_left(os.path_separator)
$if windows {
relative = relative.replace('/', '\\')
}
@ -229,7 +229,7 @@ fn test_iarna_toml_spec_tests() {
mut invalid := 0
e = 0
for i, invalid_test_file in invalid_test_files {
mut relative := invalid_test_file.all_after('toml-test').trim_left(os.path_separator)
mut relative := invalid_test_file.all_after('iarna').trim_left(os.path_separator)
$if windows {
relative = relative.replace('/', '\\')
}

View File

@ -3,19 +3,17 @@ import toml
// Instructions for developers:
// The large (1MB) TOML file can be obtained by doing:
// `cd vlib/toml/tests/testdata`
// `wget https://gist.githubusercontent.com/Larpon/89b0e3d94c6903851ff15559e5df7a05/raw/62a1f87a4e37bf157f2e0bfb32d85d840c98e422/large_toml_file_test.toml`
// `mv large_toml_file_test.toml vlib/toml/tests/testdata/`
// See also the CI toml tests
const toml_file = os.join_path_single(@VEXEROOT, 'vlib/toml/tests/testdata/large_toml_file_test.toml')
// test_large_file parser 'testdata/large_toml_file_test.toml' if found.
fn test_large_file() {
toml_file :=
os.real_path(os.join_path(os.dir(@FILE), 'testdata', os.file_name(@FILE).all_before_last('.'))) +
'.toml'
if os.exists(toml_file) {
println('Testing parsing of large (${os.file_size(toml_file)} bytes) "${toml_file}"...')
toml_doc := toml.parse_file(toml_file) or { panic(err) }
println('OK [1/1] "${toml_file}"...') // So it can be checked with `v -stats test ...`
if !os.exists(toml_file) {
eprintln('skipping ${@FILE} since ${toml_file} is missing.')
return
}
println('Testing parsing of large (${os.file_size(toml_file)} bytes) "${toml_file}"...')
doc := toml.parse_file(toml_file) or { panic(err) }
assert true
}

View File

@ -1,4 +1,4 @@
iarna/toml-test/
burntsushi/toml-test/
alexcrichton/toml-test/
iarna/
burntsushi/
alexcrichton/
large_toml_file_test.toml