diff --git a/.github/workflows/cromwell-test.yml b/.github/workflows/cromwell-test.yml new file mode 100644 index 00000000..22de1ae3 --- /dev/null +++ b/.github/workflows/cromwell-test.yml @@ -0,0 +1,146 @@ +name: Cromwell Spec Conformance - WDL 1.1 + +on: + push: + +jobs: + conformance: + runs-on: ubuntu-latest + name: Run WDL 1.1 Spec Conformance Tests + + steps: + - name: Checkout WDL spec repo + uses: actions/checkout@v4 + + - name: Checkout current repo + uses: actions/checkout@v4 + + - name: Install Java (for Cromwell) + run: | + sudo apt-get update + sudo apt-get install -y openjdk-11-jre curl + + - name: Download latest Cromwell + run: | + CROMWELL_URL=$(curl -s https://api.github.com/repos/broadinstitute/cromwell/releases/latest \ + | grep "browser_download_url" \ + | grep "cromwell-.*\.jar" \ + | cut -d '"' -f 4) + echo "Downloading $CROMWELL_URL" + curl -L $CROMWELL_URL -o cromwell.jar + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: '3.10' + + - name: Install dependencies + run: | + pip install subby + + - name: Clone WDL tests + run: | + git clone https://github.com/openwdl/wdl-tests.git + + - name: Extract tests + run: | + python3 wdl-tests/scripts/extract_tests.py \ + -i ${{ github.workspace }}/SPEC.md \ + -d ${{ github.workspace }}/tests/data/ \ + -O cromwell_test -v 1.1 + find cromwell_test/ -name "*.wdl" -type f -exec sed -i 's/^version 1.1/version development/' {} + + + - name: Run tests and capture results + run: | + mkdir -p cromwell_tests/artifacts + + echo "📊 Running tests..." + python3 wdl-tests/scripts/run_tests_cromwell.py \ + -T ${{ github.workspace }}/cromwell_test \ + -c ${{ github.workspace }}/cromwell_test/test_config.json \ + -D ${{ github.workspace }}/cromwell_test/data \ + --cromwell-jar ${{ github.workspace }}/cromwell.jar \ + -O cromwell_results | tee cromwell_tests/artifacts/result.log + + echo "📊 Parsing test summary..." + + total=$(grep "Total tests:" cromwell_tests/artifacts/result.log | awk '{print $3}') + passed=$(grep "Passed:" cromwell_tests/artifacts/result.log | awk '{print $2}') + warnings=$(grep "Warnings:" cromwell_tests/artifacts/result.log | awk '{print $2}') + failed=$(grep "Failures:" cromwell_tests/artifacts/result.log | awk '{print $2}') + invalid=$(grep "Invalid outputs:" cromwell_tests/artifacts/result.log | awk '{print $3}') + ignored=$(grep "Ignored:" cromwell_tests/artifacts/result.log | awk '{print $2}') + + # Write summary JSON + cat < cromwell_tests/artifacts/results.json + { + "total": $total, + "passed": $passed, + "warnings": $warnings, + "failures": $failed, + "invalid_outputs": $invalid, + "ignored": $ignored + } + EOF + + # Copy list of failures to artifacts + cp cromwell_tests/failed_tests.txt cromwell_tests/artifacts/failed_tests.txt || touch cromwell_tests/artifacts/failed_tests.txt + + # Generate shields.io badge JSON + color="green" + total_run=$((total - ignored)) + if [ "$passed" -lt "$total_run" ]; then color="yellow"; fi + if [ "$passed" -eq 0 ]; then color="red"; fi + cat < cromwell_tests/artifacts/shields.json + { + "schemaVersion": 1, + "label": "Cromwell WDL 1.1", + "message": "$passed/$total_run passed", + "color": "$color" + } + EOF + + - name: Upload test artifacts + uses: actions/upload-artifact@v4 + with: + name: cromwell-test-results + path: cromwell_tests/artifacts/ + + - name: Publish badge JSON to current branch + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + git config --global user.email "github-actions[bot]@users.noreply.github.com" + git config --global user.name "github-actions[bot]" + BRANCH="${GITHUB_REF_NAME}" + RUN_ID="${{ github.run_id }}" + REPO="${{ github.repository }}" + RUN_URL="https://github.com/$REPO/actions/runs/$RUN_ID" + REPO_URL="https://x-access-token:${GITHUB_TOKEN}@github.com/${{ github.repository }}.git" + + git fetch origin $BRANCH + git checkout $BRANCH + + mkdir -p shields + cp cromwell_tests/artifacts/shields.json shields/cromwell_shields.json + git add shields/cromwell_shields.json + + # Update README only if needed + sed_pattern="https://raw.githubusercontent.com/openwdl/wdl/.*/shields/cromwell_shields.json" + new_url="https://raw.githubusercontent.com/openwdl/wdl/$BRANCH/shields/cromwell_shields.json" + run_pattern="https://github.com/$REPO/actions/runs/[0-9]+" + new_run="https://github.com/$REPO/actions/runs/$RUN_ID" + if grep -qE "$sed_pattern" README.md; then + git pull + sed -E -i "/cromwell_shields\.json/s|$sed_pattern|$new_url|g" README.md + sed -E -i "/cromwell_shields\.json/s|$run_pattern|$new_run|g" README.md + git add README.md + fi + + # Only commit if there are staged changes + if ! git diff --cached --quiet; then + git commit -m "chore: updates Cromwell shields badge for \`$BRANCH\`" + git push $REPO_URL $BRANCH + else + echo "🟢 No changes to commit" + fi diff --git a/.github/workflows/miniwdl-test.yml b/.github/workflows/miniwdl-test.yml new file mode 100644 index 00000000..6daa62fe --- /dev/null +++ b/.github/workflows/miniwdl-test.yml @@ -0,0 +1,121 @@ +name: MiniWDL Spec Conformance - WDL 1.1 + +on: + push: + +jobs: + conformance: + runs-on: ubuntu-latest + name: Run WDL 1.1 Spec Conformance Tests + + steps: + - name: Checkout WDL spec repo + uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: '3.10' + + - name: Install MiniWDL and dependencies + run: | + pip install miniwdl subby + + - name: Clone WDL tests + run: | + git clone https://github.com/openwdl/wdl-tests.git + + - name: Extract tests + run: | + python wdl-tests/scripts/extract_tests.py -i ${{ github.workspace }}/SPEC.md -d ${{ github.workspace }}/tests/data/ -O miniwdl_test -v 1.1 + + - name: Run tests and capture results + run: | + mkdir -p miniwdl_tests/artifacts + + echo "📊 Running tests..." + python wdl-tests/scripts/run_tests_miniwdl.py -T ${{ github.workspace }}/miniwdl_test -c ${{ github.workspace }}/miniwdl_test/test_config.json -D ${{ github.workspace }}/miniwdl_test/data -O miniwdl_results | tee miniwdl_tests/artifacts/result.log + + echo "📊 Parsing test summary..." + + total=$(grep "Total tests:" miniwdl_tests/artifacts/result.log | awk '{print $3}') + passed=$(grep "Passed:" miniwdl_tests/artifacts/result.log | awk '{print $2}') + warnings=$(grep "Warnings:" miniwdl_tests/artifacts/result.log | awk '{print $2}') + failed=$(grep "Failures:" miniwdl_tests/artifacts/result.log | awk '{print $2}') + invalid=$(grep "Invalid outputs:" miniwdl_tests/artifacts/result.log | awk '{print $3}') + ignored=$(grep "Ignored:" miniwdl_tests/artifacts/result.log | awk '{print $2}') + + # Write summary JSON + cat < miniwdl_tests/artifacts/results.json + { + "total": $total, + "passed": $passed, + "warnings": $warnings, + "failures": $failed, + "invalid_outputs": $invalid, + "ignored": $ignored + } + EOF + + # Copy list of failures to artifacts + cp miniwdl_test/failed_tests.txt miniwdl_tests/artifacts/failed_tests.txt || touch miniwdl_tests/artifacts/failed_tests.txt + + # Generate shields.io badge JSON + color="green" + total_run=$((total - ignored)) + if [ "$passed" -lt "$total_run" ]; then color="yellow"; fi + if [ "$passed" -eq 0 ]; then color="red"; fi + cat < miniwdl_tests/artifacts/shields.json + { + "schemaVersion": 1, + "label": "MiniWDL WDL 1.1", + "message": "$passed/$total_run passed", + "color": "$color" + } + EOF + + - name: Upload test artifacts + uses: actions/upload-artifact@v4 + with: + name: miniwdl-test-results + path: miniwdl_tests/artifacts/ + + - name: Publish badge JSON to current branch + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + git config --global user.email "github-actions[bot]@users.noreply.github.com" + git config --global user.name "github-actions[bot]" + BRANCH="${GITHUB_REF_NAME}" + RUN_ID="${{ github.run_id }}" + REPO="${{ github.repository }}" + RUN_URL="https://github.com/$REPO/actions/runs/$RUN_ID" + REPO_URL="https://x-access-token:${GITHUB_TOKEN}@github.com/${{ github.repository }}.git" + + git fetch origin $BRANCH + git checkout $BRANCH + + mkdir -p shields + cp miniwdl_tests/artifacts/shields.json shields/miniwdl_shields.json + git add shields/miniwdl_shields.json + + # Update README only if needed + sed_pattern="https://raw.githubusercontent.com/openwdl/wdl/.*/shields/miniwdl_shields.json" + new_url="https://raw.githubusercontent.com/openwdl/wdl/$BRANCH/shields/miniwdl_shields.json" + run_pattern="https://github.com/$REPO/actions/runs/[0-9]+" + new_run="https://github.com/$REPO/actions/runs/$RUN_ID" + if grep -qE "$sed_pattern" README.md; then + git pull + sed -E -i "/miniwdl_shields\.json/s|$sed_pattern|$new_url|g" README.md + sed -E -i "/miniwdl_shields\.json/s|$run_pattern|$new_run|g" README.md + git add README.md + fi + + + # Only commit if there are staged changes + if ! git diff --cached --quiet; then + git commit -m "chore: updates MiniWDL shields badge for \`$BRANCH\`" + git push $REPO_URL $BRANCH + else + echo "🟢 No changes to commit" + fi diff --git a/.github/workflows/sprocket-test.yml b/.github/workflows/sprocket-test.yml new file mode 100644 index 00000000..1939d146 --- /dev/null +++ b/.github/workflows/sprocket-test.yml @@ -0,0 +1,126 @@ +name: Sprocket Spec Conformance - WDL 1.1 + +on: + push: + +jobs: + sprocket-conformance: + runs-on: ubuntu-latest + name: Run Sprocket WDL 1.1 Spec Conformance Tests + + steps: + - name: Checkout WDL spec repo + uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: '3.10' + + - name: Install Python dependencies + run: | + pip install subby + + - name: Install Sprocket dependencies + run: | + curl -y --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh + . "$HOME/.cargo/env" + cargo install sprocket --locked + + - name: Clone WDL tests + run: | + git clone https://github.com/openwdl/wdl-tests.git + + - name: Extract tests + run: | + python wdl-tests/scripts/extract_tests.py -i ${{ github.workspace }}/SPEC.md -d ${{ github.workspace }}/tests/data/ -O sprocket_test -v 1.1 + + - name: Run tests and capture results + run: | + mkdir -p sprocket_tests/artifacts + + echo "📊 Running tests..." + python wdl-tests/scripts/run_tests_sprocket.py -T ${{ github.workspace }}/sprocket_test -c ${{ github.workspace }}/sprocket_test/test_config.json -D ${{ github.workspace }}/sprocket_test/data -O sprocket_results | tee sprocket_tests/artifacts/result.log + + echo "📊 Parsing test summary..." + + total=$(grep "Total tests:" sprocket_tests/artifacts/result.log | awk '{print $3}') + passed=$(grep "Passed:" sprocket_tests/artifacts/result.log | awk '{print $2}') + warnings=$(grep "Warnings:" sprocket_tests/artifacts/result.log | awk '{print $2}') + failed=$(grep "Failures:" sprocket_tests/artifacts/result.log | awk '{print $2}') + invalid=$(grep "Invalid outputs:" sprocket_tests/artifacts/result.log | awk '{print $3}') + ignored=$(grep "Ignored:" sprocket_tests/artifacts/result.log | awk '{print $2}') + + # Write summary JSON + cat < sprocket_tests/artifacts/results.json + { + "total": $total, + "passed": $passed, + "warnings": $warnings, + "failures": $failed, + "invalid_outputs": $invalid, + "ignored": $ignored + } + EOF + + #Copy list of failures to artifacts + cp sprocket_test/failed_tests.txt sprocket_tests/artifacts/failed_tests.txt || touch sprocket_tests/artifacts/failed_tests.txt + + # Generate shields.io badge JSON + color="green" + total_run=$((total - ignored)) + if [ "$passed" -lt "$total_run" ]; then color="yellow"; fi + if [ "$passed" -eq 0 ]; then color="red"; fi + cat < sprocket_tests/artifacts/shields.json + { + "schemaVersion": 1, + "label": "Sprocket WDL 1.1", + "message": "$passed/$total_run passed", + "color": "$color" + } + EOF + + - name: Upload test artifacts + uses: actions/upload-artifact@v4 + with: + name: sprocket-test-results + path: sprocket_tests/artifacts/ + + - name: Publish badge JSON to current branch + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + git config --global user.email "github-actions[bot]@users.noreply.github.com" + git config --global user.name "github-actions[bot]" + BRANCH="${GITHUB_REF_NAME}" + RUN_ID="${{ github.run_id }}" + REPO="${{ github.repository }}" + RUN_URL="https://github.com/$REPO/actions/runs/$RUN_ID" + REPO_URL="https://x-access-token:${GITHUB_TOKEN}@github.com/${{ github.repository }}.git" + + git fetch origin $BRANCH + git checkout $BRANCH + + mkdir -p shields + cp sprocket_tests/artifacts/shields.json shields/sprocket_shields.json + git add shields/sprocket_shields.json + + # Update README only if needed + sed_pattern="https://raw.githubusercontent.com/openwdl/wdl/.*/shields/sprocket_shields.json" + new_url="https://raw.githubusercontent.com/openwdl/wdl/$BRANCH/shields/sprocket_shields.json" + run_pattern="https://github.com/$REPO/actions/runs/[0-9]+" + new_run="https://github.com/$REPO/actions/runs/$RUN_ID" + if grep -qE "$sed_pattern" README.md; then + git pull + sed -E -i "/sprocket_shields.json/s|$sed_pattern|$new_url|g" README.md + sed -E -i "/sprocket_shields.json/s|$run_pattern|$new_run|g" README.md + git add README.md + fi + + # Only commit if there are staged changes + if ! git diff --cached --quiet; then + git commit -m "chore: updates Sprocket shields badge for \`$BRANCH\`" + git push $REPO_URL $BRANCH + else + echo "🟢 No changes to commit" + fi diff --git a/.github/workflows/toil-test.yml b/.github/workflows/toil-test.yml new file mode 100644 index 00000000..2631fde0 --- /dev/null +++ b/.github/workflows/toil-test.yml @@ -0,0 +1,119 @@ +name: Toil WDL Spec Conformance - WDL 1.1 + +on: + push: + +jobs: + conformance: + runs-on: ubuntu-latest + name: Run WDL 1.1 Spec Conformance Tests + + steps: + - name: Checkout WDL spec repo + uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: '3.10' + + - name: Install Toil WDL and dependencies + run: | + pip install toil[wdl] subby + + - name: Clone WDL tests + run: | + git clone https://github.com/openwdl/wdl-tests.git + + - name: Extract tests + run: | + python wdl-tests/scripts/extract_tests.py -i ${{ github.workspace }}/SPEC.md -d ${{ github.workspace }}/tests/data/ -O toil_test -v 1.1 + + - name: Run tests and capture results + run: | + mkdir -p toil_tests/artifacts + + echo "📊 Running tests..." + python wdl-tests/scripts/run_tests_toil.py -T ${{ github.workspace }}/toil_test -c ${{ github.workspace }}/toil_test/test_config.json -D ${{ github.workspace }}/toil_test/data -O toil_results | tee toil_tests/artifacts/result.log + + echo "📊 Parsing test summary..." + + total=$(grep "Total tests:" toil_tests/artifacts/result.log | awk '{print $3}') + passed=$(grep "Passed:" toil_tests/artifacts/result.log | awk '{print $2}') + warnings=$(grep "Warnings:" toil_tests/artifacts/result.log | awk '{print $2}') + failed=$(grep "Failures:" toil_tests/artifacts/result.log | awk '{print $2}') + invalid=$(grep "Invalid outputs:" toil_tests/artifacts/result.log | awk '{print $3}') + ignored=$(grep "Ignored:" toil_tests/artifacts/result.log | awk '{print $2}') + + # Write summary JSON + cat < toil_tests/artifacts/results.json + { + "total": $total, + "passed": $passed, + "warnings": $warnings, + "failures": $failed, + "invalid_outputs": $invalid, + "ignored": $ignored + } + EOF + + # Copy list of failures to artifacts + cp toil_test/failed_tests.txt toil_tests/artifacts/failed_tests.txt || touch toil_tests/artifacts/failed_tests.txt + + # Generate shields.io badge JSON + color="green" + total_run=$((total - ignored)) + if [ "$passed" -lt "$total_run" ]; then color="yellow"; fi + if [ "$passed" -eq 0 ]; then color="red"; fi + cat < toil_tests/artifacts/shields.json + { + "schemaVersion": 1, + "label": "Toil WDL 1.1", + "message": "$passed/$total_run passed", + "color": "$color" + } + EOF + + - name: Upload test artifacts + uses: actions/upload-artifact@v4 + with: + name: toil-test-results + path: toil_tests/artifacts/ + + - name: Publish badge JSON to current branch + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + git config --global user.email "github-actions[bot]@users.noreply.github.com" + git config --global user.name "github-actions[bot]" + BRANCH="${GITHUB_REF_NAME}" + RUN_ID="${{ github.run_id }}" + REPO="${{ github.repository }}" + RUN_URL="https://github.com/$REPO/actions/runs/$RUN_ID" + REPO_URL="https://x-access-token:${GITHUB_TOKEN}@github.com/${{ github.repository }}.git" + + git fetch origin $BRANCH + git checkout $BRANCH + + mkdir -p shields + cp toil_tests/artifacts/shields.json shields/toil_shields.json + git add shields/toil_shields.json + + # Update README only if needed + sed_pattern="https://raw.githubusercontent.com/openwdl/wdl/.*/shields/toil_shields.json" + new_url="https://raw.githubusercontent.com/openwdl/wdl/$BRANCH/shields/toil_shields.json" + run_pattern="https://github.com/$REPO/actions/runs/[0-9]+" + new_run="https://github.com/$REPO/actions/runs/$RUN_ID" + if grep -qE "$sed_pattern" README.md; then + git pull + sed -E -i "/toil_shields\.json/s|$sed_pattern|$new_url|g" README.md + sed -E -i "/toil_shields\.json/s|$run_pattern|$new_run|" README.md + git add README.md + fi + + if ! git diff --cached --quiet; then + git commit -m "chore: updates Toil WDL shields badge for \`$BRANCH\`" + git push $REPO_URL $BRANCH + else + echo "🟢 No changes to commit" + fi diff --git a/CHANGELOG.md b/CHANGELOG.md index 126052c3..7155cd08 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -45,9 +45,16 @@ version development version 1.1.3 --------------------------- -* Fix issues with examples (#653, #654, #661, #662, #663, #664, #665, #666, #668, #671). Thanks to @stxue1! -* Clarify that a file is not required to exist or be accessible until and unless it is accessed. -* Fix unit test for `round()` to properly test for round-half-up behavior as described. ++ Fix issues with examples (#653, #654, #661, #662, #663, #664, #665, #666, #668, #671). Thanks to @stxue1! + ++ Clarify that a file is not required to exist or be accessible until and unless it is accessed. + ++ Fix unit test for `round()` to properly test for round-half-up behavior as described. + ++ Fix issues with examples (#707, #708, #701). [PR 706](https://github.com/openwdl/wdl/pull/706) by @vsmalladi + ++ Add in CI/CD for Miniwdl, Sprocket, Toil and Cromwell for spec compliance + version 1.1.2 --------------------------- diff --git a/README.md b/README.md index 83d8e316..31a6234d 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,14 @@ # Workflow Description Language (WDL) +| Engine | Conformance Tests | +|-----------|------------------| +| MiniWDL | [![MiniWDL Tests](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/openwdl/wdl/fix-test_1.1/shields/miniwdl_shields.json)](https://github.com/openwdl/wdl/actions/runs/18596013854) | +| Sprocket | [![Sprocket Tests](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/openwdl/wdl/fix-test_1.1/shields/sprocket_shields.json)](https://github.com/openwdl/wdl/actions/runs/18596013815) | +| Toil | [![Toil Tests](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/openwdl/wdl/fix-test_1.1/shields/toil_shields.json)](https://github.com/openwdl/wdl/actions/runs/18596013841) | +| Cromwell | [![Cromwell Tests](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/openwdl/wdl/fix-test_1.1/shields/cromwell_shields.json)](https://github.com/openwdl/wdl/actions/runs/18596013833) | + + + The **Workflow Description Language (WDL)** is an open standard for describing data processing workflows with a human-readable and writeable syntax. WDL makes it straightforward to define analysis tasks, connect them together in workflows, and parallelize their execution. The language strives to be accessible and understandable to all manner of users, including programmers, analysts, and operators of a production system. diff --git a/SPEC.md b/SPEC.md index b3e3497f..4980e717 100644 --- a/SPEC.md +++ b/SPEC.md @@ -1071,7 +1071,7 @@ workflow test_object { a: 10, b: "hello" } - Int i = f.a + Int i = obj.a } } ``` @@ -1161,12 +1161,14 @@ Example output: "account_number": "123456", "routing_number": 300211325, "balance": 3.5, - "pin_digits": [1, 2, 3, 4] + "pin_digits": [1, 2, 3, 4], + "username": null } }, "test_struct.has_account": true } ``` +

@@ -1446,9 +1448,9 @@ workflow map_to_struct { # What are the keys to this Struct? Words map_coercion = { - a: 10, - b: 11, - c: 12 + "a": 10, + "b": 11, + "c": 12 } } } @@ -1471,9 +1473,9 @@ Example output: "c": 12 }, "map_to_struct.map_coercion": { - "beware": 10, - "key": 11, - "lookup": 12 + "a": 10, + "b": 11, + "c": 12 } } ``` @@ -2430,7 +2432,7 @@ task flags { >>> output { - String num_matches = read_int(stdout()) + Int num_matches = read_int(stdout()) } } ``` @@ -2449,7 +2451,7 @@ Example output: ```json { - "flags.num_matches": "2" + "flags.num_matches": 2 } ```

@@ -3730,7 +3732,7 @@ Test config: ```json { - "exclude_output": "csvs" + "exclude_output": "outputs.csvs" } ```

@@ -3839,7 +3841,7 @@ Test config: ```json { - "exclude_output": "outfiles" + "exclude_output": "glob.outfiles" } ```

@@ -3890,7 +3892,8 @@ Test config: ```json { - "exclude_output": "bashrc" + "exclude_output": "relative_and_absolute.bashrc", + "priority": "ignore" } ```

@@ -3943,6 +3946,15 @@ Example output: "optional_output.file_array": ["example1.txt", null] } ``` + +Test config: + +```json +{ + "exclude_output": "optional_output.file_array" +} +``` +

@@ -4254,7 +4266,7 @@ task test_gpu { } runtime { - container: "archlinux:latest" + container: "ubuntu:latest" gpu: true } } @@ -4279,7 +4291,8 @@ Test config: ```json { - "dependencies": "gpu" + "dependencies": "gpu", + "priority": "ignore" } ```

@@ -4369,7 +4382,7 @@ task multi_mount_points { } runtime { - # The first value will be mounted at the execution root + # The first value will be mounted at the execution root disks: ["2", "/mnt/outputs 4 GiB", "/mnt/tmp 1 GiB"] } } @@ -4443,7 +4456,7 @@ task single_return_code { >>> runtime { - return_codes: 1 + returnCodes: 1 } } ``` @@ -4465,7 +4478,7 @@ Test config: ```json { - "return_code": 1 + "returnCodes": 0 } ```

@@ -4484,7 +4497,7 @@ task multi_return_code { >>> runtime { - return_codes: [1, 2, 5, 10] + returnCodes: [1, 2, 5, 10] } } ``` @@ -4507,7 +4520,7 @@ Test config: ```json { "fail": true, - "return_code": 42 + "returnCodes": 42 } ```

@@ -4520,13 +4533,13 @@ Example: all_return_codes_task.wdl ```wdl version 1.1 -task multi_return_code_task { +task all_return_codes { command <<< exit 42 >>> runtime { - return_codes: "*" + returnCodes: "*" } } ``` @@ -4548,7 +4561,7 @@ Test config: ```json { - "return_code": 42 + "returnCodes": 0 } ```

@@ -4611,6 +4624,15 @@ Example output: "test_hints.num_lines": 2 } ``` + +Test config: + +```json +{ + "priority": "ignore" +} +``` +

@@ -4831,7 +4853,7 @@ task ex_paramter_meta { >>> output { - String result = read_int(stdout()) + Int result = read_int(stdout()) } runtime { @@ -4854,7 +4876,7 @@ Example output: ```json { - "ex_paramter_meta.result": "2" + "ex_paramter_meta.result": 2 } ```

@@ -4874,7 +4896,9 @@ version 1.1 task hisat2 { input { File index_tar_gz - String sra_acc + File fastq1 + File fastq2 + String sample_name Int? max_reads Int threads = 8 Float memory_gb = 16 @@ -4885,16 +4909,17 @@ task hisat2 { command <<< mkdir "~{index_id}" - tar -C "~{index_id}" --strip-components 2 -xzf "~{index_tar_gz}" + tar -C "~{index_id}" --strip-components 1 -xzf "~{index_tar_gz}" hisat2 \ -p ~{threads} \ ~{if defined(max_reads) then "-u ~{select_first([max_reads])}" else ""} \ - -x "~{index_id}" \ - --sra-acc ~{sra_acc} > ~{sra_acc}.sam + -1 ~{fastq1} -2 ~{fastq2} \ + -x "~{index_id}"/genome \ + > ~{sample_name}.sam >>> output { - File sam = "output.sam" + File sam = "~{sample_name}.sam" } runtime { @@ -4910,7 +4935,9 @@ task hisat2 { parameter_meta { index_tar_gz: "Gzipped tar file with HISAT2 index files" - sra_acc: "SRA accession number or reads to align" + fastq1: "The FASTQ file containing all read ones." + fastq2: "The FASTQ file containing all read twos." + sample_name: "Name of the sample" } } ``` @@ -4920,9 +4947,11 @@ Example input: ```json { - "hisat2.index_tar_gz": "https://genome-idx.s3.amazonaws.com/hisat/grch38_genome.tar.gz", - "hisat2.sra_acc": "SRR3440404", - "hisat2.max_reads": 10 + "index_tar_gz": "https://genome-idx.s3.amazonaws.com/hisat/grch38_genome.tar.gz", + "fastq1": " https://storage.googleapis.com/genomics-public-data/gatk-examples/example1/NA20274/ERR250968_1.filt.fastq.gz", + "fastq2":" https://storage.googleapis.com/genomics-public-data/gatk-examples/example1/NA20274/ERR250968_2.filt.fastq.gz", + "sample_name": "NA20274", + "max_reads": 10 } ``` @@ -4930,7 +4959,7 @@ Example output: ```json { - "hisat2.sam": "SRR3440404.sam" + "hisat2.sam": "NA20274.sam" } ``` @@ -4938,7 +4967,8 @@ Test config: ```json { - "dependencies": ["cpu", "memory", "disks"] + "dependencies": ["cpu", "memory", "disks"], + "priority": "ignore" } ```

@@ -4981,6 +5011,7 @@ task gatk_haplotype_caller { ln -s ~{reference.fasta} ref/~{reference.id}.fasta ln -s ~{reference.index} ref/~{reference.id}.fasta.fai ln -s ~{reference.dict} ref/~{reference.id}.dict + samtools index ~{bam} gatk --java-options "-Xmx~{memory_gb}g" HaplotypeCaller \ ~{if defined(interval) then "-L ~{select_first([interval])}" else ""} \ -R ref/~{reference.id}.fasta \ @@ -5018,22 +5049,22 @@ Example input: ```json { - "gatk_haplotype_caller.bam": "ftp://ftp-trace.ncbi.nlm.nih.gov/ReferenceSamples/giab/data/NA12878/NIST_NA12878_HG001_HiSeq_300x/RMNISTHS_30xdownsample.bam", - "gatk_haplotype_caller.reference": { - "id":"Homo_sapiens_assembly38", - "fasta": "https://storage.googleapis.com/genomics-public-data/resources/broad/hg38/v0/Homo_sapiens_assembly38.fasta", - "index": "https://storage.googleapis.com/genomics-public-data/resources/broad/hg38/v0/Homo_sapiens_assembly38.fasta.fai", - "dict": "https://storage.googleapis.com/genomics-public-data/resources/broad/hg38/v0/Homo_sapiens_assembly38.dict" - }, - "gatk_haplotype_caller.interval": "chr1:1000000-1010000" -} + "bam": "https://storage.googleapis.com/genomics-public-data/1000-genomes/bam/HG00107.mapped.ILLUMINA.bwa.GBR.low_coverage.20130415.bam", + "reference": { + "id":"Homo_sapiens_assembly19_1000genomes_decoy", + "fasta": "https://storage.googleapis.com/genomics-public-data/references/Homo_sapiens_assembly19_1000genomes_decoy/Homo_sapiens_assembly19_1000genomes_decoy.fasta", + "index": "https://storage.googleapis.com/genomics-public-data/references/Homo_sapiens_assembly19_1000genomes_decoy/Homo_sapiens_assembly19_1000genomes_decoy.fasta.fai", + "dict": "https://storage.googleapis.com/genomics-public-data/references/Homo_sapiens_assembly19_1000genomes_decoy/Homo_sapiens_assembly19_1000genomes_decoy.dict" + }, + "interval": "1:12505000-12506000" + } ``` Example output: ```json { - "gatk_haplotype_caller.vcf": "HG002.vcf" + "gatk_haplotype_caller.vcf": "HG00107.mapped.ILLUMINA.bwa.GBR.low_coverage.20130415.vcf" } ``` @@ -5041,7 +5072,8 @@ Test config: ```json { - "dependencies": ["memory", "disks"] + "dependencies": ["memory", "disks"], + "priority": "ignore" } ```

@@ -5193,14 +5225,14 @@ When a [call statement](#call-statement) needs to refer to a task or workflow in
-Example: call_imported_task.wdl +Example: call_imported.wdl ```wdl version 1.1 import "input_ref_call.wdl" as ns1 -workflow call_imported_task { +workflow call_imported { input { Int x Int y = d1.out @@ -5220,7 +5252,7 @@ Example input: ```json { - "call_imported_task.x": 5 + "call_imported.x": 5 } ``` @@ -5228,7 +5260,7 @@ Example output: ```json { - "call_imported_task.result": 20 + "call_imported.result": 20 } ```

@@ -6511,7 +6543,7 @@ workflow test_sub { String chocoearly = sub(chocolike, "late", "early") # I like chocoearly when\nit's early String chocolate = sub(chocolike, "late$", "early") # I like chocolate when\nit's early String chocoearlylate = sub(chocolike, "[^ ]late", "early") # I like chocearly when\nit's late - String choco4 = sub(chocolike, " [:alpha:]{4} ", " 4444 ") # I 4444 chocolate when\nit's late + String choco4 = sub(chocolike, " [[:alpha:]]{4} ", " 4444 ") # I 4444 chocolate when\nit's late String no_newline = sub(chocolike, "\\n", " ") # "I like chocolate when it's late" } } @@ -6592,7 +6624,7 @@ Test config: ```json { - "exclude_output": ["data_file"] + "exclude_output": ["change_extension.data_file"] } ```

@@ -6728,7 +6760,7 @@ Test config: ```json { - "exclude_output": ["files"] + "exclude_output": ["gen_files.files"] } ```

@@ -6776,15 +6808,16 @@ version 1.1 task file_sizes { command <<< - printf "this file is 22 bytes\n" > created_file + printf "this file is 22 bytes\n" > out.txt >>> File? missing_file = None output { - Float missing_file_bytes = size(missing_file) # 0.0 - Float created_file_bytes = size("created_file", "B") # 22.0 - Float multi_file_kb = size(["created_file", missing_file], "K") # 0.022 + File created_file = "out.txt" + Float missing_file_bytes = size(missing_file, "B") # 0.0 + Float created_file_bytes = size(created_file, "B") # 22.0 + Float multi_file_kb = size([created_file, missing_file], "K") # 0.022 } runtime { @@ -6826,7 +6859,7 @@ Returns the value of the executed command's standard output (stdout) as a `File`
-Example: echo_stdout.wdl +Example: echo_stdout_task.wdl ```wdl version 1.1 @@ -6871,7 +6904,7 @@ Returns the value of the executed command's standard error (stderr) as a `File`.
-Example: echo_stderr.wdl +Example: echo_stderr_task.wdl ```wdl version 1.1 @@ -7834,6 +7867,10 @@ task read_objects { output { Array[Object] my_obj = read_objects(stdout()) } + + runtime { + container: "python:latest" + } } ``` @@ -8764,11 +8801,13 @@ workflow test_unzip { Map[String, Int] m = {"a": 0, "b": 1, "c": 2} Pair[Array[String], Array[Int]] keys_and_values = unzip(as_pairs(m)) Pair[Array[Int], Array[String]] expected1 = ([0, 42], ["hello", "goodbye"]) + Array[String] expected_keys = ["a", "b", "c"] + Array[Int] expected_values = [0, 1, 2] output { Boolean is_true1 = unzip(int_str_arr) == expected1 - Boolean is_true2 = keys_and_values.left == ["a", "b", "c"] - Boolean is_true3 = keys_and_values.right == [0, 1, 2] + Boolean is_true2 = keys_and_values.left == expected_keys + Boolean is_true3 = keys_and_values.right == expected_values } } ``` @@ -8820,15 +8859,19 @@ workflow test_flatten { Array[Array[Pair[Float, String]]] aap2D = [[(0.1, "mouse")], [(3, "cat"), (15, "dog")]] Map[Float, String] f2s = as_map(flatten(aap2D)) Array[Array[Array[Int]]] ai3D = [[[1, 2], [3, 4]], [[5, 6], [7, 8]]] + Array[Int] expected1D = [1, 2, 3, 1, 21, 22] Array[File] expected2D = ["/tmp/X.txt", "/tmp/Y.txt", "/tmp/Z.txt"] Array[Array[Int]] expected3D = [[1, 2], [3, 4], [5, 6], [7, 8]] + Array[Pair[Float, String]] expectedArray = [(0.1, "mouse"), (3.0, "cat"), (15.0, "dog")] + Map[Float, String] expectedMap = {0.1: "mouse", 3.0: "cat", 15.0: "dog"} } output { - Boolean is_true1 = flatten(ai2D) == [1, 2, 3, 1, 21, 22] + Boolean is_true1 = flatten(ai2D) == expected1D Boolean is_true2 = flatten(af2D) == expected2D - Boolean is_true3 = flatten(aap2D) == [(0.1, "mouse"), (3, "cat"), (15, "dog")] + Boolean is_true3 = flatten(aap2D) == expectedArray Boolean is_true4 = flatten(ai3D) == expected3D + Boolean is_true5 = f2s == expectedMap } } ``` @@ -8847,7 +8890,8 @@ Example output: "test_flatten.is_true1": true, "test_flatten.is_true2": true, "test_flatten.is_true3": true, - "test_flatten.is_true4": true + "test_flatten.is_true4": true, + "test_flatten.is_true5": true } ```

@@ -9007,9 +9051,10 @@ workflow test_select_all { } Array[Int] fivethree = select_all([maybe_five, maybe_four_but_is_not, maybe_three]) + Array[Int] expected = [5, 3] output { - Boolean is_true = fivethree == [5, 3] + Boolean is_true = length(fivethree) == 2 && fivethree == expected } } ``` @@ -9225,9 +9270,10 @@ workflow test_keys { } Array[String] str_to_files_keys = key + Array[String] expected = ["a", "b", "c"] output { - Boolean is_true1 = keys(x) == ["a", "b", "c"] + Boolean is_true1 = length(keys(x)) == 3 && keys(x) == expected Boolean is_true2 = str_to_files_keys == keys(str_to_files) } } @@ -9933,7 +9979,7 @@ task serde_array_lines { >>> output { - Array[Int] matches = read_lines(stdout()) + Array[String] matches = read_lines(stdout()) } } ``` @@ -9952,7 +9998,7 @@ Example output: ```json { - "serde_array_lines.matches": [2, 2] + "serde_array_lines.matches": ["2", "2"] } ```

@@ -10113,7 +10159,7 @@ Example output: ```json { "serde_pair.tails_of_two": { - "Houston": "Chicago" + "Chicago": "Piscataway" } } ``` @@ -10143,7 +10189,7 @@ task serde_int_strings { >>> output { - Array[Int] ints = read_lines(stdout()) + Array[String] ints = read_lines(stdout()) } } @@ -10157,7 +10203,7 @@ workflow serde_homogeneous_pair { } output { - Array[Int] ints = flatten(serde_int_strings.ints) + Array[String] ints = flatten(serde_int_strings.ints) } } ``` @@ -10178,7 +10224,7 @@ Example output: ```json { - "serde_homogeneous_pair.ints": [1, 2, 3, 4] + "serde_homogeneous_pair.ints": ["1", "2", "3", "4"] } ```

diff --git a/shields/cromwell_shields.json b/shields/cromwell_shields.json new file mode 100644 index 00000000..5fe2d98d --- /dev/null +++ b/shields/cromwell_shields.json @@ -0,0 +1,6 @@ +{ + "schemaVersion": 1, + "label": "Cromwell WDL 1.1", + "message": "93/144 passed", + "color": "yellow" +} diff --git a/shields/miniwdl_shields.json b/shields/miniwdl_shields.json new file mode 100644 index 00000000..b5274a2b --- /dev/null +++ b/shields/miniwdl_shields.json @@ -0,0 +1,6 @@ +{ + "schemaVersion": 1, + "label": "MiniWDL WDL 1.1", + "message": "137/144 passed", + "color": "yellow" +} diff --git a/shields/sprocket_shields.json b/shields/sprocket_shields.json new file mode 100644 index 00000000..c6fdd683 --- /dev/null +++ b/shields/sprocket_shields.json @@ -0,0 +1,6 @@ +{ + "schemaVersion": 1, + "label": "Sprocket WDL 1.1", + "message": "144/144 passed", + "color": "green" +} diff --git a/shields/toil_shields.json b/shields/toil_shields.json new file mode 100644 index 00000000..2fa5a0ff --- /dev/null +++ b/shields/toil_shields.json @@ -0,0 +1,6 @@ +{ + "schemaVersion": 1, + "label": "Toil WDL 1.1", + "message": "131/144 passed", + "color": "yellow" +} diff --git a/tests/data/sample1234_R1.fastq b/tests/data/sample1234_R1.fastq new file mode 100644 index 00000000..8acf53c0 --- /dev/null +++ b/tests/data/sample1234_R1.fastq @@ -0,0 +1,128 @@ +@fqlib10:947:LYRHOKA:4:40:8409:8283/1 +TATGTCGCGTCCTTTAACGCGAATGGCGGTTAAGAGGAACGTTACGTTTAAGACAGCCGAAAGTCTTGGCCCTTCCCGCCATTGCAGGGATCACACAGGCT ++ +978755195:595769/6/446445345656455852.46.976;57557987475456-9=58240:<:3837469565353759247573434043816 +@fqlib10:947:LYRHOKA:2:51:3108:1220/1 +CAACGAGACCCCTCTAGACAAACGGCTCATGGTTGTATATCCGCACACAACCGGCCGGCGGGGTTGCGAACCTAGCACTCATCGTGAGCCGCTACAATCTG ++ +757446475867373768585565476755479785471258787:2476<55758548568272947748369678822897595794165997568867 +@fqlib10:947:LYRHOKA:5:53:4903:4769/1 +ACATTACCTGTAGAGCGTATCGCACCATAATGCCATGCGAGACAGGAATTATCAGCTTCGAAGCCCATCCAGTGGACTACTCCTAGATATCACATTTTCGC ++ +578372844449338631605646367:66556285259;769:845966:;84426766638533:7868533;2483278784465227:732360368 +@fqlib10:947:LYRHOKA:4:36:8675:1001/1 +ATTTTACTGTTCTCCTTTTTAACGCATTCTGAGAATGTCCCGTAGCGTTTGAATTGCCGCAAGATACACACCCGCCCCAAACAGCAGGATAAGAGCGGAGA ++ +776955229579;22852429369:9331::9485:09495564767821659342527:55:58565:16=:8;634<3321:8724776<:587387/4 +@fqlib10:947:LYRHOKA:6:47:8205:5311/1 +CCGCCCTGGCATGCGCTTCTTTCCGGAAGATCCGCTATGGTTATAGAACGTCCGGTTTTGTCAACTCAGTTTAGATCTACAGAACGGCTTAAGATTCTTTA ++ +866874454763348171756668376626625917564739<564135634425354725544789874638/1535762769856795:6335764957 +@fqlib10:947:LYRHOKA:3:28:1170:5626/1 +CCGCATTCGTCTCCCCAAAGCGCCATGGCAGCGTCGTCGCAGCGTACTCACTACCGTTGGCACGAGCACACTGATTATAGTGCAGGAACCTCTATGAGGGG ++ +878385425426347834765568662595583137355553217:87678645243=6371:9965614956494507;587473877335632881358 +@fqlib10:947:LYRHOKA:4:12:8130:9550/1 +AAAGGGGCTTATAATGAACTCCGCGGTTAGCATTCTCATCTTGGGTAGACATATACGTCTACCTCTAACTGCGCTATAGCTCCTCCCTCGGCTCTACATCT ++ +2:578585844853467;8388398476768463476573385783/88852509162:7666235946447640757743034:047885864;415284 +@fqlib10:947:LYRHOKA:7:59:9748:4121/1 +TGACTATTAATGTCACGTCGATTCTACAATTTCATGATGGTAGTAAGTAAGTGAAGGTGAGTCCGGGAGGACATGTGTAAGTGACAACTTGGATTATGGCG ++ +334.3579455;16.63771866914:75698;6458274063245488;8766839;;3=5662389567243793254:635/97502;653583959; +@fqlib10:947:LYRHOKA:6:45:7221:5557/1 +GTATATGCTATCCTGGCTCGCGACTAACTCCTGAGAAATCAGAGCATCCCGAGTCGACTATTACTACCAAACCGAGGTTCTTTAGCGTGCTGAAGGTGCGT ++ +8239357::8662/6663764625185774577447387947859:445323475596299564343884463294318:4<45;5358579553=14693 +@fqlib10:947:LYRHOKA:7:13:8133:7636/1 +CTGTAACGTCTTCCGCATGAATCAGTCCAGTAATAGTGGCGACGGGCCAAAATCGATTCGCCCAGTCACACACATCGTGCTCATTTAGCGTTTCCCCAATT ++ +42649:3494473579164197738174<167:6847598845684783:37737;4359776<452434529567958295733:775266:43765729 +@fqlib10:947:LYRHOKA:4:41:8623:3398/1 +TGATTCTAGGCGTTAAACATGCATTTCTACGCAGAGCAAGGATGCTTTGAGGTGAAAAACCCTGGTTCCAGGATAGACTTAGACTATGTTCTAACGGGAGC ++ +94244646347:3:587385177785675615702201895537677=5783.623974641<73373439450835:6866849513766843756;533 +@fqlib10:947:LYRHOKA:1:31:4070:8650/1 +GTAACGCATACCGCTATCAGTACGACGTCCGATCTTTTAGCGGCGGAAGAGTTGTCCCATCCGGGTAACTAATCCCTCGCGCCAAGAATTGCATCCGGAGA ++ +:055765705745236367265127/225029927034244628/168874461;735373684786;3766:47477:55685255577587;83:3678 +@fqlib10:947:LYRHOKA:8:31:2459:454/1 +CCGCGTTTTAGAACACTCTTTTGTAAAGTTTCTGACCTGTGGATTATAACGGTCGGTCCTCGACCACAGAAGAGACCCTCTGACCCATATTGTTCTTACTT ++ +4166512585667985:4765773:57.36832795165764.7384473435:3574464684966848452445625606;8557:9594577437624 +@fqlib10:947:LYRHOKA:3:52:8369:6383/1 +AGGAATATTACTTTCGTCCTAGGAGGTCTTGAGTGACGCCACTCGTAAAGTCCCCTAATGGAGGCACATACAACGTCGCTGATATATACCCTATTTACTGA ++ +6747864081:156664473994:568686.6459779734696748215747692259065354379364164578555452;545;0451951652789 +@fqlib10:947:LYRHOKA:4:45:9043:3773/1 +CAGAGATATAAGGTGAGGGGCCGTTCCGGGGAGTCCAAAAACGTTCTAAAGTACTTCAGAACTCTTCGACAATTCGCCGAGGCGGAGGCCTAATTTTTAGA ++ +8847755576:5;;35:25158546238646556743547523830646878287598338258:76476817543196:27364878470055796:242 +@fqlib10:947:LYRHOKA:8:51:2598:8283/1 +TATCTGCCAAGAGCGGAAAACGGCTTGTTACGCAACAGGAGAATAGATCGTTTGGGTTGGCACAACAGTTGAAGAGCTACAATTAGCCGTCGACACAGGGC ++ +745984245575<37731564297;758231537453664;44520:5/634163888428556748760747828772475213498<641257565642 +@fqlib10:947:LYRHOKA:4:47:4404:2906/1 +TCTGAAGTGGAACTCTCCAACTAGAGCGCACGTAAAGAGGTTCCAAGTCTTAACGGCGACAGTCATGACGGAACCCTAACTAGCGAGATGCCCGCCAGATT ++ +7665429467750579728377724556529;71628.6963586846445793/47023157774963583592264470544234545:8548:44.:3 +@fqlib10:947:LYRHOKA:3:25:9486:6446/1 +GGTATCATCGAAGGGTAGCGGCGCCTTGTTAACGTACCTTCATACTCCGGCCCTGAGGTGTAGTAAAGGGAATCATGATTTACGCGGGTCATGATTAAGAT ++ +2973355376159657763936375675<5847388036963834877363:33456874683;8;:8<90,9:657283864467554619508179;37 +@fqlib10:947:LYRHOKA:7:58:5624:7586/1 +CGTTCGGGCGGAATTAGGACCCACCGTACCCCCCCGTCGTTGTCAACACGCGCACTCTTCAACTGTCTGCCCCGACCTCCCACCCGTATCCGGTTCGAAAG ++ +695;7737492:765345736868982567516780454;/5256316;686225677967586/62436457555968135788:667452534551773 +@fqlib10:947:LYRHOKA:3:7:5378:5434/1 +GACATGTTAAGCGCAGAGTACCTTGCTTGGAAGCCCGATCAGGCTTACCACCGTGCCAAACACATCATATCACCGGATACATGAATTCTCTTCACGGATGC ++ +;38855548473369=22539:66<5368569::6767539423656651482705488233479835578776226:657471:77628422742768;5 +@fqlib10:947:LYRHOKA:3:3:4480:6120/1 +TCATTCCAAGTTACATAATCATAGACTTCTCCGCCCTAGAAGAGTAACCGCCGGGAATAAGGTGCACCCAATAAGGCTCTTGCCGCGCGCATGGCCATAAA ++ +25333;3939578734561:443;5966441129:7553359362747:7618:657343:847531691;57794:729884333779557<53478645 +@fqlib10:947:LYRHOKA:1:54:5176:198/1 +TGTCCGGTGTCTGTTAAACCATACCATACCCCTCCTCTGAACGAGGCTACCTGCACTCGCACCCGGCGGAAACGATTACATTCGTAAGGGTAAATGATGCT ++ +6897834915:1;6386812:8658088528059868366286734293785154:6/5488347945445:8<744604462564062526465549344 +@fqlib10:947:LYRHOKA:5:5:9769:9926/1 +TCGCGGTTGAGCATTGCTGATTTGCATAGCGCGGTTCTGAGCATTACCTCGTAAGGTCGGGATTCTGTGCGAAGCAGCATCAGACTGGACATCGACGGGAA ++ +7255355556576368863868309744601336;873;895959423668:16392344:225417957:/219:4994731933484579611948169 +@fqlib10:947:LYRHOKA:4:51:578:7363/1 +GTCGCCCTCAAAAATCTTCATCGAACCATCGGTCGTGGCGTTTGGCTTGCGACCTAGAGGGAACTACAAGCCAGTGATTGGATACTGGTAGTCGTTGGGGA ++ +65696157;534684.94:5>8474:3;59526466;727465179444532586379<497698489552555687278877/66;76455646769;4: +@fqlib10:947:LYRHOKA:3:44:1563:5455/1 +CGCTCTTATGTATACCATATATAGCGGCTTTACAATGCGTCTCATTTTGACCACGGGGTGCGACTAAGAGATACCCTAGTACTGAGGAGCTCTCGGAACTC ++ +49264907625694877577456:632627934356/7436;885525;285222<88741715643252527567:263355046644859737965537 +@fqlib10:947:LYRHOKA:4:24:9507:1257/1 +CCATTCAATTGTTTGGTTGCCGGTCAGAAATCTGCAATCGTGTAAACTTGCTAAGTAGCCTGAGTTCATCTTAATCAAGCTCTTAGATTTCGTCGTGAGCT ++ +601433842806;;:5557879631739755849311647745359678704592:6<569;73649533;;:648224::595844:5976467:53556 +@fqlib10:947:LYRHOKA:6:46:495:9410/1 +TCCGACATGACATAACCGACCGAGCTGTAACTGAACCAGTGCACCCCTAAGCTGGCGCCGCTACGAAGTAACAAAACAAAGTTTAGATATACCGGATGTCG ++ +6.768<447137564729663608636925737461>76/72;885:7:07945594825:5786735126963473668:15816799433068084174 +@fqlib10:947:LYRHOKA:8:55:6774:4250/1 +GTAACACTGGAAGACGAGCAGGTTGATAGCCTACATTGCTTGGCAATGGAGATATGTACGCTGCATGCGCAAAAGTCACCCCAAAATTCACGGAACGTCGA ++ +9773497377:7778;743.51484:4956;6467547825648665975<5776;6293274575767461783366746458236419:4654364847 +@fqlib10:947:LYRHOKA:5:4:1823:2503/1 +TTTCTACTTTAGTATCGGGCCCCAGATTTTGACGGGAGATTCAAATTGGGCCGTTGACACTCCTTCTCCTTTGGTGAAGGCTACAAACGGTCGGCTATAGG ++ +747614484566464865856786119464465643826489581;44449:7532;6649;4716394:;212344745052226542864277454478 +@fqlib10:947:LYRHOKA:7:46:4093:9994/1 +ACTCACTTTGCTACGGTCTTAGCGCTGGCTAAGAGCAACTGGATTTAACGATAGATACGTAGCAAGTACTTGACCGCTGGTGTGCAGTGTCTAGCCCGTAT ++ +594767:785965715362737:7525:1656649791304:258778264:2636337754644755446256563573877967:49687884425755 +@fqlib10:947:LYRHOKA:3:15:1161:1874/1 +CTTAATTTGTGGCCTGTCTTTCGAATTCGTGAATTATGCATCCTTGGGCTCTCAACGTCCAAGCTATTGTGCGATGACTAATATAAAACTCAACTTCTGTT ++ +754465469587257764366583333:7:633370556292:3995755:6330897173793859:487295425/478554652<5745725737986 +@fqlib10:947:LYRHOKA:8:45:3121:1485/1 +ACATAATTTTTCAAGATTTCAGCCACAAGACTTTTTTAACCGAATATGGGAGGGCATTTTAAGAATTGAAATCATAAGTCATAAGTGTAGAGTCTCAGAAG ++ +5/<36630:66356594480556254175379236883663857758554485606597775477724:7767933853/6;44279575585:6969594 diff --git a/tests/data/sample1234_R2.fastq b/tests/data/sample1234_R2.fastq new file mode 100644 index 00000000..9febbc52 --- /dev/null +++ b/tests/data/sample1234_R2.fastq @@ -0,0 +1,128 @@ +@fqlib10:947:LYRHOKA:4:40:8409:8283/2 +GTCATCCGTATCTCCATGTTGTTTCCTCGTCTGATTTACGCAACATGAATCCCCAGGTGCTGTACCCTAAGAATTAACACGAAATACTGGCTCACGCAGTT ++ +79598696:17936;756634:855641:765462675;4;55455369:75637868536468756754727951440363;133433412892626654 +@fqlib10:947:LYRHOKA:2:51:3108:1220/2 +TAAGGCGGATGAGCAAATGCGTACGCAACGCAAGTGATCAGCATAACGGAGGGCCATATGCATAAGTAATGTATCGCACTGGAGAGACGAGGAGAACTGCC ++ +23347672584915:4596158946374178636651456007954596587614354764;35546/4:93525756955486888855;7986734734 +@fqlib10:947:LYRHOKA:5:53:4903:4769/2 +ATAAGCTGACAACCTCCCGCGAGATGCCCCCTTGCCCTACTTATCTAAAGCCCTCTAAAAATTTCACGCGCGGGTCCTCTTATCCTGTGGAGGTGAGCAGT ++ +8352296753>375756<72537::857646378367584375;79587256015885782657538474:367916428488596969955593536352 +@fqlib10:947:LYRHOKA:4:36:8675:1001/2 +AACCCGGTCGAAGTCTGCCCCTCACAAGGCCGCCCCATTCTTATGATGTAGCTTGGTGCACCCCTTAATATGCTGATCGGCGTTTTGATACCATGAGCTCG ++ +:76:753:/876147669747354970870731846535/46479752664534665482326306773877884927729496658:8648754754517 +@fqlib10:947:LYRHOKA:6:47:8205:5311/2 +GGTCTATGATAACGCGCCGACGCAGGTAAATGTAGAGGCGTATGACAGCGAGGCTCAGGCACGATGGACTAATTAAGTTTTCGCCTTCGCAATATCTCGTT ++ +475555357;436397::35369449:<174644877547257524372484777343856289424342;633:5622567356:7/87604674170:6 +@fqlib10:947:LYRHOKA:3:28:1170:5626/2 +ATAACTCCGTGAATGCGGAAGGTGACCGTCGTGTACCTTCGAATGACTAATCTGGTCCAAACTCTCTTCCTATTAAGGTCTGACCATCGTGTCTCGCCGTG ++ +4257693:878454548115654346549673:345;568473756577878444729588349563755757159623436336778582026754;753 +@fqlib10:947:LYRHOKA:4:12:8130:9550/2 +AACATGCATATAATTAGCGTGCTACGACCGAGAGAGGGCGTAGCTAGTAACCCCGCCCGTTTTTGGGTGGTACAACCCGGAATGAGAACTAAGCCGGGCGT ++ +5853741269652867:25458464558457763673674734:944/4464634667;792295326404526515731305286489877:66594662 +@fqlib10:947:LYRHOKA:7:59:9748:4121/2 +TTTCGCGTCCCGTGAGCCTCGGTGGTAACAATGTGTCCGCGGTGAGTTCACCCGATACGAACACAGCCCATATCATCGATTTTTCGCCTACATAGTCCGCG ++ +144887344551555:746<6774828136683;87957089:54793;96;3664162957766/27263865345:5645491;208334459380444 +@fqlib10:947:LYRHOKA:6:45:7221:5557/2 +ACAGAGCGGCACGTACGAGCAAATGTCGCCTCCGCAAGGCCGGCCAGTAAACATCGTGTAGCGGTTTTTTTAAATCGATGAGGTTCTTACCGGAAGCTTAG ++ +96555657538457438431:04357775542797786754759468271334751566733553864553666671089362972784866441;48879 +@fqlib10:947:LYRHOKA:7:13:8133:7636/2 +CCAACTCATCCCTAAACCTGGATCAGTAGAGATGCGGTTGAGCCTCGACAAATTTTGAGCTAGCCCCACACTAAGGCAAGGCTACTCCCCTACGCTCCGCA ++ +744<43805897:879837363:625477607569:73891855583519684442668767742:32664676<985588/666<5568757573436:2 +@fqlib10:947:LYRHOKA:4:41:8623:3398/2 +CCCTAAGTGGCCCGGTCCTTTGAGACTATCAATGGGTCCGCAGGCGTCTAGTATTAAGATGTTCACTAAAACCTCGACGCAGGTGAACACCTGCAGGCGAG ++ +687632/:2::26353443<79139376924490755785;1948867/5:80885695/4726782;657;45536:27266431245636785296475 +@fqlib10:947:LYRHOKA:1:31:4070:8650/2 +GGATGGTATGCACGAAAGGAAGCATTTCGAAGCGTCGAACGATGTGGTCCTATACAACGTGCGCAAACCTCGAAAGTTTACGCCCGTAAGGAGCCTCTCAC ++ +26-4548856548398134337544343<5557469<717;58699565989741539:443145:555765748664478315:43267735;06134:6 +@fqlib10:947:LYRHOKA:8:31:2459:454/2 +AAACCGCCGGTACTTTTACACTAAGCAGTGTCCTAGTAAAGTGACATGCAAGGGTATATGCGTGACCAGCGGCGCCTTTACTCGCGTAGGGAATACTCTAA ++ +3435046654;797665:855232;7<535623:4025<97366268<1335529836:1583>55966346457588319412866697550632767;7 +@fqlib10:947:LYRHOKA:3:52:8369:6383/2 +TTACCTGGGTTCTTCCCATTGGTCATGTATTACCATATTCGACTAGGGCGCATAATTCCGTGTACGCCATCCATGACTCAGTTCGACGCATGGTTCCTACC ++ +59752577;7567774;3087759<87:7587207629544578:382645586<645936573936039;1:133562775676553755<921962406 +@fqlib10:947:LYRHOKA:4:45:9043:3773/2 +GCTCAACTGTGTTGTGTGGGGAAGGTCGAGCTATGCTAATTCAAGGGAGCTCCTGCCCCCTCTATAGCACTTAGTGAGACTTTTCGCGCTTAATTAGGGTC ++ +7:5863545:7379273677946674278975;38678347853:4737656851864;336633<166335<5785344299787786=81347:5451: +@fqlib10:947:LYRHOKA:8:51:2598:8283/2 +CTAACAAGCATGGTAAACGCGAAGTAGGTTGCCGAGTAGTTGAGGGTACTTCCCCCTAGGCCTCGGAACCACCGTTTAAGGCAGCTCACATGCATATAATG ++ +775452156>7<43925758:;316537643647273;0382047677510598782866848673:9:87547669367:7937467973655392:7/6 +@fqlib10:947:LYRHOKA:4:47:4404:2906/2 +TAATGTGCTCAACAAACCCAAAACCTATTTCCTTAACTTCCGCAACTATAAAAGTAGCACGGGTTGTATTACCCAAGGAGCGAGTCTGCTTCCCGCCACCT ++ +7949599452585734365:56573544545945424;464867263335539939767744652289:7880688299;44265344483513478197; +@fqlib10:947:LYRHOKA:3:25:9486:6446/2 +ACCTCGAAAACAATTACTGTCGAGGTCCTAGACGTTCTCTAGCCATCCAAATGGAATGTGAGGTCTACCATGCCGTAATCGTGCGCCTACTAGATTTCCGG ++ +24464:8362568590;446;973778476674878753:3822629:99896766594:573554;2286864388363565867495570664483263 +@fqlib10:947:LYRHOKA:7:58:5624:7586/2 +CGCTTATAGCTGTTTGCAGGGATACTCGACCTCTTCAACTCAATGTGTGTGATCGTCCAACCATGCGAACCTATTGAAGCTTGTACACGTCAGCTACTCTT ++ +26736447121748483876398855499723355954553736397849774<6972566455882376336=36758463245:668483744563676 +@fqlib10:947:LYRHOKA:3:7:5378:5434/2 +TGACAGTTTGGGGCTTGGAGATGCTTAACATACGCATCGTTCGCTTCCACCGCAAAGAACTTTAGCAGTCCTGACCACTACGAGTGTGCGGCTTTGCAAGG ++ +56417515781=75681848675956375733517675237265455532766749267425:4456374843:692>54;6884874:073368369366 +@fqlib10:947:LYRHOKA:3:3:4480:6120/2 +CACTTCCGTCTTTCTACTTTGTAAACACAAACCGCTAAAGATTCCGAGGTGTTCCAAGTTCCTGTGAGGGCATGAGCGATTGTCGCCAGATACTGTCGCCA ++ +55665399656777571/37745496334:87208645373476538807;5625;986943447768776:585974753:5666584854376476985 +@fqlib10:947:LYRHOKA:1:54:5176:198/2 +TGAGAGTGACTTCTCCTGGAAACAGTAGAACTGACGTGTTTGGCAATGCATTTCGAATAACTAGGTCATCGTCATGTATTACTATGTGACCTAGTATTCGA ++ +634<644725887879:456873996346/;6248064560:5813676687:56575:/206937755532527872:5<:4545570277486315637 +@fqlib10:947:LYRHOKA:5:5:9769:9926/2 +TGAGCTCGTCCTATCGCGAACAACTTCCGAGCGTCAGTATACTCAACACTCGTAGCTCTGGAACATGTCTAACTCAAAGGTAGATCGGTTAGGTCGTCCGG ++ +53129553864344;89526647585455602657993986/34<651:65786474935656/36:9373465742763:339057;52543/5359566 +@fqlib10:947:LYRHOKA:4:51:578:7363/2 +ATCGCAACGTAGGTGCGACGGTTGGCAGGTATGTCCCGCTGCCCAAGGGCTACATTGATAGCGTAATAGGTGGCATTTTAGATAATCCTCTTAGTGGGAGA ++ +6273469175656/72:7236737084624067848857237869239855242645762475552116696:5648352458448896.4<787862739 +@fqlib10:947:LYRHOKA:3:44:1563:5455/2 +GCGATTCACTCCGCAGTATTCTAGCCGGGACTGCTACATGCCTTGCGGGAAAGAGACGGCCAGCGGGTAAGAATGGCCGGTTTGTTACAGCGTGGCAGTTC ++ +62863556025454099754388984723;6:975665623663876135;6343;296728046362227963:3776273;467:47691457554441 +@fqlib10:947:LYRHOKA:4:24:9507:1257/2 +AGCAAACCGGTTATAAATCTGCGTATTGTTGGACTAACGTACTACATTATTAGTACTTTAGAGAGTTCATGTCAAGGGAACCGCTCTAGAACCATCCTGCA ++ +68;676945945316736552967524596095/34358346:566645716488525346587443.349455568845367:7;7462;7676577979 +@fqlib10:947:LYRHOKA:6:46:495:9410/2 +ATGGAATAAGTCGAAGCCGCCAGACGGACCAATCACTCCAGCTGATCGCTAGTTGCCAGAGGATTCACGAAGATACTAAGTGCCGTACATTTTAAAAAAGG ++ +84:19;6525675661555358597<256756787656780;95423783658372:7975883:<123;91.3474<3<6764:47637468:7776525 +@fqlib10:947:LYRHOKA:8:55:6774:4250/2 +CACTCAACGTCATCATCTGTGCAGGACTTAGCCATGGAGTGAGAGACGTTCTTTCCGCTGCACATCAGCATTCCATCATGGGGGCACCAAAGAATGTCACA ++ +0365467965095468155=5377947.61.88714204;:742:536:48486355387645830:2585657659394465394489;94545386433 +@fqlib10:947:LYRHOKA:5:4:1823:2503/2 +AACACTTACCGGCGCCGGGGTGGTACTTATATTAAGACCATTCTTGCAACTGCTCTCGCGCTTTGGTTGTCCTAAGATATAAACTCGACGCTCGAGTTATT ++ +2851548754136376:8535.8478559847816758479656;9546276665:6625213485:583564437615548376773850465<854069 +@fqlib10:947:LYRHOKA:7:46:4093:9994/2 +CTGAAAGCTTCTGCTGGAATTGTATGTCTAGATAACACCCCACGATACGTAAACACCAGGGTTAAACTGGGAACATACTATGCTCCGCCCTTCTACTAATA ++ +7:086:654:8;574=:71834679874835825636875564636975826455648565596655:52786148759275244383:155;36647575 +@fqlib10:947:LYRHOKA:3:15:1161:1874/2 +TCAGGCGTATTATAACGAGGTAAATGGCTGTCGCGCTCCCGTACGCTTATAGGACTACTTGTCACTGCCCCGTATAAACCATGTCTTTATTGGAAAGGAAT ++ +85945:78596667:7458338536834834317595855879533575:65/@.:803655247670383396=/4557727955423485246778622 +@fqlib10:947:LYRHOKA:8:45:3121:1485/2 +AATCTGAGTACCTTATAATCCGAGTGCAATGAGGAACGAGCCAATCATTGTGCCAGACATTACTACAGGACACGCACTGAGGACGTGAAAATTGTTCTCAC ++ +638865276746;639571322254/694:775798665617571:5486:9425818644859365777:4:7496;28351590654725533543626