testdriverai 7.1.0 → 7.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +2 -0
- package/.github/workflows/linux-tests.yml +28 -0
- package/agent/index.js +18 -45
- package/agent/interface.js +13 -2
- package/agent/lib/commands.js +1 -1
- package/agent/lib/redraw.js +1 -1
- package/agent/lib/sandbox.js +30 -2
- package/agent/lib/valid-version.js +2 -2
- package/debugger/index.html +1 -1
- package/docs/docs.json +86 -125
- package/docs/v6/getting-started/self-hosting.mdx +3 -2
- package/docs/v7/_drafts/agents.mdx +852 -0
- package/docs/v7/_drafts/auto-cache-key.mdx +167 -0
- package/docs/v7/{guides → _drafts}/caching-selectors.mdx +125 -17
- package/docs/v7/_drafts/dashcam-title-feature.mdx +89 -0
- package/docs/v7/_drafts/error-handling.mdx +501 -0
- package/docs/v7/_drafts/implementation-plan.mdx +994 -0
- package/docs/v7/_drafts/init-command.mdx +95 -0
- package/docs/v7/_drafts/optimal-sdk-design.mdx +1348 -0
- package/docs/v7/_drafts/plugin-migration.mdx +222 -0
- package/docs/v7/_drafts/prompt-cache.mdx +200 -0
- package/docs/{QUICK_START_TEST_RECORDING.md → v7/_drafts/quick-start-test-recording.mdx} +3 -3
- package/docs/v7/_drafts/sdk-logging.mdx +222 -0
- package/docs/v7/_drafts/sdk-migration.mdx +474 -0
- package/docs/v7/_drafts/sdk-v7-complete.mdx +345 -0
- package/docs/v7/{guides → _drafts}/self-hosting.mdx +1 -1
- package/docs/v7/{guides → _drafts}/troubleshooting.mdx +2 -2
- package/docs/v7/{guides → _drafts}/vitest-plugin.mdx +4 -4
- package/docs/v7/api/{ai.mdx → act.mdx} +24 -24
- package/docs/v7/api/client.mdx +1 -1
- package/docs/v7/api/dashcam.mdx +2 -2
- package/docs/v7/api/elements.mdx +143 -41
- package/docs/v7/api/find.mdx +258 -0
- package/docs/v7/api/type.mdx +51 -7
- package/docs/v7/features/ai-native.mdx +427 -0
- package/docs/v7/features/easy-to-write.mdx +351 -0
- package/docs/v7/features/enterprise.mdx +540 -0
- package/docs/v7/features/fast.mdx +424 -0
- package/docs/v7/features/observable.mdx +623 -0
- package/docs/v7/features/powerful.mdx +531 -0
- package/docs/v7/features/scalable.mdx +417 -0
- package/docs/v7/features/stable.mdx +514 -0
- package/docs/v7/getting-started/configuration.mdx +1 -1
- package/docs/v7/getting-started/generating-tests.mdx +525 -0
- package/docs/v7/getting-started/installation.mdx +486 -0
- package/docs/v7/getting-started/quickstart.mdx +51 -5
- package/docs/v7/getting-started/running-and-debugging.mdx +511 -0
- package/docs/v7/getting-started/setting-up-in-ci.mdx +612 -0
- package/docs/v7/getting-started/writing-tests.mdx +535 -0
- package/docs/v7/overview/what-is-testdriver.mdx +398 -0
- package/docs/v7/playwright.mdx +3 -3
- package/docs/v7/presets/chrome.mdx +16 -0
- package/docs/v7/presets/electron.mdx +18 -0
- package/docs/v7/presets/vscode.mdx +19 -0
- package/examples/run-tests-with-recording.sh +70 -0
- package/examples/screenshot-example.js +63 -0
- package/examples/sdk-awesome-logs-demo.js +177 -0
- package/examples/sdk-cache-thresholds.js +96 -0
- package/examples/sdk-element-properties.js +155 -0
- package/examples/sdk-simple-example.js +65 -0
- package/examples/test-recording-example.test.js +166 -0
- package/interfaces/cli/commands/init.js +358 -0
- package/interfaces/vitest-plugin.mjs +214 -10
- package/{src → lib}/core/Dashcam.js +41 -4
- package/{src → lib}/vitest/hooks.mjs +118 -100
- package/lib/vitest/setup.mjs +44 -0
- package/package.json +9 -10
- package/sdk.d.ts +15 -2
- package/sdk.js +70 -18
- package/{self-hosted.yml → setup/aws/self-hosted.yml} +1 -1
- package/{testdriver/acceptance-sdk → test/manual}/test-console-logs.test.mjs +1 -1
- package/test/manual/test-find-api.js +73 -0
- package/test/manual/test-init.sh +54 -0
- package/test/manual/test-prompt-cache.js +96 -0
- package/test/manual/test-provision-auth.mjs +22 -0
- package/test/manual/test-sandbox-render.js +28 -0
- package/test/manual/test-sdk-methods.js +15 -0
- package/test/manual/test-sdk-refactor.js +53 -0
- package/test/manual/test-stack-trace.mjs +57 -0
- package/test/testdriver/assert.test.mjs +41 -0
- package/{testdriver/acceptance-sdk → test/testdriver}/auto-cache-key-demo.test.mjs +1 -1
- package/{testdriver/acceptance-sdk → test/testdriver}/drag-and-drop.test.mjs +1 -1
- package/{testdriver/acceptance-sdk → test/testdriver}/element-not-found.test.mjs +1 -1
- package/{testdriver/acceptance-sdk → test/testdriver}/exec-js.test.mjs +1 -1
- package/{testdriver/acceptance-sdk → test/testdriver}/exec-output.test.mjs +3 -3
- package/{testdriver/acceptance-sdk → test/testdriver}/exec-pwsh.test.mjs +3 -3
- package/{testdriver/acceptance-sdk → test/testdriver}/focus-window.test.mjs +1 -1
- package/{testdriver/acceptance-sdk → test/testdriver}/formatted-logging.test.mjs +1 -1
- package/{testdriver/acceptance-sdk → test/testdriver}/hover-image.test.mjs +1 -1
- package/{testdriver/acceptance-sdk → test/testdriver}/hover-text-with-description.test.mjs +1 -1
- package/{testdriver/acceptance-sdk → test/testdriver}/hover-text.test.mjs +1 -1
- package/{testdriver/acceptance-sdk → test/testdriver}/match-image.test.mjs +1 -1
- package/{testdriver/acceptance-sdk → test/testdriver}/press-keys.test.mjs +1 -1
- package/{testdriver/acceptance-sdk → test/testdriver}/prompt.test.mjs +2 -2
- package/{testdriver/acceptance-sdk → test/testdriver}/scroll-keyboard.test.mjs +1 -1
- package/{testdriver/acceptance-sdk → test/testdriver}/scroll-until-image.test.mjs +1 -1
- package/{testdriver/acceptance-sdk → test/testdriver}/scroll-until-text.test.mjs +1 -1
- package/{testdriver/acceptance-sdk → test/testdriver}/scroll.test.mjs +1 -1
- package/{src/vitest/lifecycle.mjs → test/testdriver/setup/lifecycleHelpers.mjs} +84 -99
- package/test/testdriver/setup/testHelpers.mjs +653 -0
- package/{testdriver/acceptance-sdk → test/testdriver}/type.test.mjs +1 -1
- package/vitest.config.mjs +11 -57
- package/.github/dependabot.yml +0 -11
- package/.github/workflows/acceptance-linux.yml +0 -75
- package/.github/workflows/acceptance-sdk-tests.yml +0 -133
- package/.github/workflows/acceptance-tests.yml +0 -130
- package/.github/workflows/lint.yml +0 -27
- package/.github/workflows/publish-canary.yml +0 -40
- package/.github/workflows/publish-latest.yml +0 -61
- package/.github/workflows/test-install.yml +0 -29
- package/.vscode/extensions.json +0 -3
- package/.vscode/launch.json +0 -22
- package/.vscode/settings.json +0 -14
- package/AGENTS.md +0 -550
- package/CODEOWNERS +0 -2
- package/_testdriver/acceptance/assert.yaml +0 -7
- package/_testdriver/acceptance/dashcam.yaml +0 -9
- package/_testdriver/acceptance/drag-and-drop.yaml +0 -49
- package/_testdriver/acceptance/embed.yaml +0 -9
- package/_testdriver/acceptance/exec-js.yaml +0 -29
- package/_testdriver/acceptance/exec-output.yaml +0 -43
- package/_testdriver/acceptance/exec-shell.yaml +0 -40
- package/_testdriver/acceptance/focus-window.yaml +0 -16
- package/_testdriver/acceptance/hover-image.yaml +0 -18
- package/_testdriver/acceptance/hover-text-with-description.yaml +0 -29
- package/_testdriver/acceptance/hover-text.yaml +0 -14
- package/_testdriver/acceptance/if-else.yaml +0 -31
- package/_testdriver/acceptance/match-image.yaml +0 -15
- package/_testdriver/acceptance/press-keys.yaml +0 -35
- package/_testdriver/acceptance/prompt.yaml +0 -11
- package/_testdriver/acceptance/remember.yaml +0 -27
- package/_testdriver/acceptance/screenshots/cart.png +0 -0
- package/_testdriver/acceptance/scroll-keyboard.yaml +0 -34
- package/_testdriver/acceptance/scroll-until-image.yaml +0 -26
- package/_testdriver/acceptance/scroll-until-text.yaml +0 -20
- package/_testdriver/acceptance/scroll.yaml +0 -33
- package/_testdriver/acceptance/snippets/login.yaml +0 -29
- package/_testdriver/acceptance/snippets/match-cart.yaml +0 -8
- package/_testdriver/acceptance/type.yaml +0 -29
- package/_testdriver/behavior/failure.yaml +0 -7
- package/_testdriver/behavior/hover-text.yaml +0 -13
- package/_testdriver/behavior/lifecycle/postrun.yaml +0 -10
- package/_testdriver/behavior/lifecycle/prerun.yaml +0 -8
- package/_testdriver/behavior/lifecycle/provision.yaml +0 -8
- package/_testdriver/behavior/secrets.yaml +0 -7
- package/_testdriver/edge-cases/dashcam-chrome.yaml +0 -8
- package/_testdriver/edge-cases/exec-pwsh-multiline.yaml +0 -10
- package/_testdriver/edge-cases/js-exception.yaml +0 -8
- package/_testdriver/edge-cases/js-promise.yaml +0 -19
- package/_testdriver/edge-cases/lifecycle/postrun.yaml +0 -10
- package/_testdriver/edge-cases/prompt-in-middle.yaml +0 -23
- package/_testdriver/edge-cases/prompt-nested.yaml +0 -7
- package/_testdriver/edge-cases/success-test.yaml +0 -9
- package/_testdriver/examples/android/example.yaml +0 -12
- package/_testdriver/examples/android/lifecycle/postrun.yaml +0 -11
- package/_testdriver/examples/android/lifecycle/provision.yaml +0 -47
- package/_testdriver/examples/android/readme.md +0 -7
- package/_testdriver/examples/chrome-extension/lifecycle/provision.yaml +0 -74
- package/_testdriver/examples/desktop/lifecycle/prerun.yaml +0 -0
- package/_testdriver/examples/desktop/lifecycle/provision.yaml +0 -64
- package/_testdriver/examples/vscode-extension/lifecycle/provision.yaml +0 -73
- package/_testdriver/examples/web/lifecycle/postrun.yaml +0 -7
- package/_testdriver/examples/web/lifecycle/prerun.yaml +0 -22
- package/_testdriver/lifecycle/postrun.yaml +0 -8
- package/_testdriver/lifecycle/prerun.yaml +0 -15
- package/_testdriver/lifecycle/provision.yaml +0 -25
- package/docs/v7/guides/ci-cd/azure.mdx +0 -587
- package/docs/v7/guides/ci-cd/circleci.mdx +0 -523
- package/docs/v7/guides/ci-cd/github-actions.mdx +0 -457
- package/docs/v7/guides/ci-cd/gitlab.mdx +0 -498
- package/docs/v7/guides/ci-cd/jenkins.mdx +0 -664
- package/docs/v7/guides/ci-cd/travis.mdx +0 -438
- package/scripts/view-test-results.mjs +0 -96
- package/src/vitest/extended.mjs +0 -108
- package/src/vitest/index.mjs +0 -64
- package/src/vitest/utils.mjs +0 -150
- package/styles/.vale-config/2-MDX.ini +0 -5
- package/styles/Microsoft/AMPM.yml +0 -9
- package/styles/Microsoft/Accessibility.yml +0 -30
- package/styles/Microsoft/Acronyms.yml +0 -64
- package/styles/Microsoft/Adverbs.yml +0 -272
- package/styles/Microsoft/Auto.yml +0 -11
- package/styles/Microsoft/Avoid.yml +0 -14
- package/styles/Microsoft/Contractions.yml +0 -50
- package/styles/Microsoft/Dashes.yml +0 -13
- package/styles/Microsoft/DateFormat.yml +0 -8
- package/styles/Microsoft/DateNumbers.yml +0 -40
- package/styles/Microsoft/DateOrder.yml +0 -8
- package/styles/Microsoft/Ellipses.yml +0 -9
- package/styles/Microsoft/FirstPerson.yml +0 -16
- package/styles/Microsoft/Foreign.yml +0 -13
- package/styles/Microsoft/Gender.yml +0 -8
- package/styles/Microsoft/GenderBias.yml +0 -42
- package/styles/Microsoft/GeneralURL.yml +0 -11
- package/styles/Microsoft/HeadingAcronyms.yml +0 -7
- package/styles/Microsoft/HeadingColons.yml +0 -8
- package/styles/Microsoft/HeadingPunctuation.yml +0 -13
- package/styles/Microsoft/Headings.yml +0 -28
- package/styles/Microsoft/Hyphens.yml +0 -14
- package/styles/Microsoft/Negative.yml +0 -13
- package/styles/Microsoft/Ordinal.yml +0 -13
- package/styles/Microsoft/OxfordComma.yml +0 -8
- package/styles/Microsoft/Passive.yml +0 -183
- package/styles/Microsoft/Percentages.yml +0 -7
- package/styles/Microsoft/Plurals.yml +0 -7
- package/styles/Microsoft/Quotes.yml +0 -7
- package/styles/Microsoft/RangeTime.yml +0 -13
- package/styles/Microsoft/Semicolon.yml +0 -8
- package/styles/Microsoft/SentenceLength.yml +0 -6
- package/styles/Microsoft/Spacing.yml +0 -8
- package/styles/Microsoft/Suspended.yml +0 -7
- package/styles/Microsoft/Terms.yml +0 -42
- package/styles/Microsoft/URLFormat.yml +0 -9
- package/styles/Microsoft/Units.yml +0 -16
- package/styles/Microsoft/Vocab.yml +0 -25
- package/styles/Microsoft/We.yml +0 -11
- package/styles/Microsoft/Wordiness.yml +0 -127
- package/styles/Microsoft/meta.json +0 -4
- package/styles/alex/Ablist.yml +0 -274
- package/styles/alex/Condescending.yml +0 -16
- package/styles/alex/Gendered.yml +0 -110
- package/styles/alex/LGBTQ.yml +0 -55
- package/styles/alex/OCD.yml +0 -10
- package/styles/alex/Press.yml +0 -12
- package/styles/alex/ProfanityLikely.yml +0 -1289
- package/styles/alex/ProfanityMaybe.yml +0 -282
- package/styles/alex/ProfanityUnlikely.yml +0 -251
- package/styles/alex/README.md +0 -27
- package/styles/alex/Race.yml +0 -85
- package/styles/alex/Suicide.yml +0 -26
- package/styles/alex/meta.json +0 -4
- package/styles/config/vocabularies/Docs/accept.txt +0 -47
- package/styles/config/vocabularies/Docs/reject.txt +0 -4
- package/styles/proselint/Airlinese.yml +0 -8
- package/styles/proselint/AnimalLabels.yml +0 -48
- package/styles/proselint/Annotations.yml +0 -9
- package/styles/proselint/Apologizing.yml +0 -8
- package/styles/proselint/Archaisms.yml +0 -52
- package/styles/proselint/But.yml +0 -8
- package/styles/proselint/Cliches.yml +0 -782
- package/styles/proselint/CorporateSpeak.yml +0 -30
- package/styles/proselint/Currency.yml +0 -5
- package/styles/proselint/Cursing.yml +0 -15
- package/styles/proselint/DateCase.yml +0 -7
- package/styles/proselint/DateMidnight.yml +0 -7
- package/styles/proselint/DateRedundancy.yml +0 -10
- package/styles/proselint/DateSpacing.yml +0 -7
- package/styles/proselint/DenizenLabels.yml +0 -52
- package/styles/proselint/Diacritical.yml +0 -95
- package/styles/proselint/GenderBias.yml +0 -45
- package/styles/proselint/GroupTerms.yml +0 -39
- package/styles/proselint/Hedging.yml +0 -8
- package/styles/proselint/Hyperbole.yml +0 -6
- package/styles/proselint/Jargon.yml +0 -11
- package/styles/proselint/LGBTOffensive.yml +0 -13
- package/styles/proselint/LGBTTerms.yml +0 -15
- package/styles/proselint/Malapropisms.yml +0 -8
- package/styles/proselint/Needless.yml +0 -358
- package/styles/proselint/Nonwords.yml +0 -38
- package/styles/proselint/Oxymorons.yml +0 -22
- package/styles/proselint/P-Value.yml +0 -6
- package/styles/proselint/RASSyndrome.yml +0 -30
- package/styles/proselint/README.md +0 -12
- package/styles/proselint/Skunked.yml +0 -13
- package/styles/proselint/Spelling.yml +0 -17
- package/styles/proselint/Typography.yml +0 -11
- package/styles/proselint/Uncomparables.yml +0 -50
- package/styles/proselint/Very.yml +0 -6
- package/styles/proselint/meta.json +0 -15
- package/styles/write-good/Cliches.yml +0 -702
- package/styles/write-good/E-Prime.yml +0 -32
- package/styles/write-good/Illusions.yml +0 -11
- package/styles/write-good/Passive.yml +0 -183
- package/styles/write-good/README.md +0 -27
- package/styles/write-good/So.yml +0 -5
- package/styles/write-good/ThereIs.yml +0 -6
- package/styles/write-good/TooWordy.yml +0 -221
- package/styles/write-good/Weasel.yml +0 -29
- package/styles/write-good/meta.json +0 -4
- package/test/dashcam.test.js +0 -137
- package/test/mcp-example-test.yaml +0 -27
- package/test/test_parser.js +0 -47
- package/testdriver/acceptance-sdk/QUICK_REFERENCE.md +0 -61
- package/testdriver/acceptance-sdk/README.md +0 -128
- package/testdriver/acceptance-sdk/TEST_REPORTING.md +0 -245
- package/testdriver/acceptance-sdk/assert.test.mjs +0 -26
- package/testdriver/acceptance-sdk/hooks-example.test.mjs +0 -38
- package/testdriver/acceptance-sdk/presets-example.test.mjs +0 -87
- package/testdriver/acceptance-sdk/setup/testHelpers.mjs +0 -420
- package/testdriver/acceptance-sdk/sully-ai.test.mjs +0 -234
- package/testdriver/acceptance-sdk/type-checking-demo.js +0 -49
- package/vale.ini +0 -18
- package/vitest.config.example.js +0 -19
- package/vitest.config.mjs.bak +0 -44
- /package/docs/{ARCHITECTURE.md → v7/_drafts/architecture.mdx} +0 -0
- /package/docs/{AWESOME_LOGS_QUICK_REF.md → v7/_drafts/awesome-logs-quick-ref.mdx} +0 -0
- /package/docs/v7/{guides → _drafts}/best-practices.mdx +0 -0
- /package/docs/v7/{guides → _drafts}/caching-ai.mdx +0 -0
- /package/docs/v7/{guides → _drafts}/caching.mdx +0 -0
- /package/docs/{MIGRATION.md → v7/_drafts/cli-to-sdk-migration.mdx} +0 -0
- /package/{CONTRIBUTING.md → docs/v7/_drafts/contributing.mdx} +0 -0
- /package/docs/v7/{progressive-apis/CORE.md → _drafts/core.mdx} +0 -0
- /package/docs/v7/{guides → _drafts}/debugging.mdx +0 -0
- /package/docs/v7/{guides → _drafts}/faq.mdx +0 -0
- /package/docs/v7/{progressive-apis/HOOKS.md → _drafts/hooks.mdx} +0 -0
- /package/docs/v7/{guides → _drafts}/migration.mdx +0 -0
- /package/docs/v7/{guides → _drafts}/performance.mdx +0 -0
- /package/docs/{PRESETS.md → v7/_drafts/presets.mdx} +0 -0
- /package/docs/v7/{progressive-apis/PROGRESSIVE_DISCLOSURE.md → _drafts/progressive-disclosure.mdx} +0 -0
- /package/docs/v7/{progressive-apis/PROVISION.md → _drafts/provision.mdx} +0 -0
- /package/docs/{SDK_AWESOME_LOGS.md → v7/_drafts/sdk-awesome-logs.mdx} +0 -0
- /package/docs/{sdk-browser-rendering.md → v7/_drafts/sdk-browser-rendering.mdx} +0 -0
- /package/docs/{TEST_RECORDING.md → v7/_drafts/test-recording.mdx} +0 -0
- /package/docs/v7/{guides → _drafts}/vitest.mdx +0 -0
- /package/docs/v7/{README.md → overview/readme.mdx} +0 -0
- /package/{src → lib}/core/index.d.ts +0 -0
- /package/{src → lib}/core/index.js +0 -0
- /package/{src → lib}/presets/index.mjs +0 -0
- /package/{src → lib}/vitest/hooks.d.ts +0 -0
- /package/{debug-locate-response.js → test/manual/debug-locate-response.js} +0 -0
- /package/{verify-element-api.js → test/manual/verify-element-api.js} +0 -0
- /package/{verify-types.js → test/manual/verify-types.js} +0 -0
- /package/{testdriver/acceptance-sdk → test/testdriver}/chrome-extension.test.mjs +0 -0
- /package/{testdriver/acceptance-sdk → test/testdriver}/setup/globalTeardown.mjs +0 -0
- /package/{testdriver/acceptance-sdk → test/testdriver}/setup/vitestSetup.mjs +0 -0
|
@@ -1,183 +0,0 @@
|
|
|
1
|
-
extends: existence
|
|
2
|
-
message: "'%s' may be passive voice. Use active voice if you can."
|
|
3
|
-
ignorecase: true
|
|
4
|
-
level: warning
|
|
5
|
-
raw:
|
|
6
|
-
- \b(am|are|were|being|is|been|was|be)\b\s*
|
|
7
|
-
tokens:
|
|
8
|
-
- '[\w]+ed'
|
|
9
|
-
- awoken
|
|
10
|
-
- beat
|
|
11
|
-
- become
|
|
12
|
-
- been
|
|
13
|
-
- begun
|
|
14
|
-
- bent
|
|
15
|
-
- beset
|
|
16
|
-
- bet
|
|
17
|
-
- bid
|
|
18
|
-
- bidden
|
|
19
|
-
- bitten
|
|
20
|
-
- bled
|
|
21
|
-
- blown
|
|
22
|
-
- born
|
|
23
|
-
- bought
|
|
24
|
-
- bound
|
|
25
|
-
- bred
|
|
26
|
-
- broadcast
|
|
27
|
-
- broken
|
|
28
|
-
- brought
|
|
29
|
-
- built
|
|
30
|
-
- burnt
|
|
31
|
-
- burst
|
|
32
|
-
- cast
|
|
33
|
-
- caught
|
|
34
|
-
- chosen
|
|
35
|
-
- clung
|
|
36
|
-
- come
|
|
37
|
-
- cost
|
|
38
|
-
- crept
|
|
39
|
-
- cut
|
|
40
|
-
- dealt
|
|
41
|
-
- dived
|
|
42
|
-
- done
|
|
43
|
-
- drawn
|
|
44
|
-
- dreamt
|
|
45
|
-
- driven
|
|
46
|
-
- drunk
|
|
47
|
-
- dug
|
|
48
|
-
- eaten
|
|
49
|
-
- fallen
|
|
50
|
-
- fed
|
|
51
|
-
- felt
|
|
52
|
-
- fit
|
|
53
|
-
- fled
|
|
54
|
-
- flown
|
|
55
|
-
- flung
|
|
56
|
-
- forbidden
|
|
57
|
-
- foregone
|
|
58
|
-
- forgiven
|
|
59
|
-
- forgotten
|
|
60
|
-
- forsaken
|
|
61
|
-
- fought
|
|
62
|
-
- found
|
|
63
|
-
- frozen
|
|
64
|
-
- given
|
|
65
|
-
- gone
|
|
66
|
-
- gotten
|
|
67
|
-
- ground
|
|
68
|
-
- grown
|
|
69
|
-
- heard
|
|
70
|
-
- held
|
|
71
|
-
- hidden
|
|
72
|
-
- hit
|
|
73
|
-
- hung
|
|
74
|
-
- hurt
|
|
75
|
-
- kept
|
|
76
|
-
- knelt
|
|
77
|
-
- knit
|
|
78
|
-
- known
|
|
79
|
-
- laid
|
|
80
|
-
- lain
|
|
81
|
-
- leapt
|
|
82
|
-
- learnt
|
|
83
|
-
- led
|
|
84
|
-
- left
|
|
85
|
-
- lent
|
|
86
|
-
- let
|
|
87
|
-
- lighted
|
|
88
|
-
- lost
|
|
89
|
-
- made
|
|
90
|
-
- meant
|
|
91
|
-
- met
|
|
92
|
-
- misspelt
|
|
93
|
-
- mistaken
|
|
94
|
-
- mown
|
|
95
|
-
- overcome
|
|
96
|
-
- overdone
|
|
97
|
-
- overtaken
|
|
98
|
-
- overthrown
|
|
99
|
-
- paid
|
|
100
|
-
- pled
|
|
101
|
-
- proven
|
|
102
|
-
- put
|
|
103
|
-
- quit
|
|
104
|
-
- read
|
|
105
|
-
- rid
|
|
106
|
-
- ridden
|
|
107
|
-
- risen
|
|
108
|
-
- run
|
|
109
|
-
- rung
|
|
110
|
-
- said
|
|
111
|
-
- sat
|
|
112
|
-
- sawn
|
|
113
|
-
- seen
|
|
114
|
-
- sent
|
|
115
|
-
- set
|
|
116
|
-
- sewn
|
|
117
|
-
- shaken
|
|
118
|
-
- shaven
|
|
119
|
-
- shed
|
|
120
|
-
- shod
|
|
121
|
-
- shone
|
|
122
|
-
- shorn
|
|
123
|
-
- shot
|
|
124
|
-
- shown
|
|
125
|
-
- shrunk
|
|
126
|
-
- shut
|
|
127
|
-
- slain
|
|
128
|
-
- slept
|
|
129
|
-
- slid
|
|
130
|
-
- slit
|
|
131
|
-
- slung
|
|
132
|
-
- smitten
|
|
133
|
-
- sold
|
|
134
|
-
- sought
|
|
135
|
-
- sown
|
|
136
|
-
- sped
|
|
137
|
-
- spent
|
|
138
|
-
- spilt
|
|
139
|
-
- spit
|
|
140
|
-
- split
|
|
141
|
-
- spoken
|
|
142
|
-
- spread
|
|
143
|
-
- sprung
|
|
144
|
-
- spun
|
|
145
|
-
- stolen
|
|
146
|
-
- stood
|
|
147
|
-
- stridden
|
|
148
|
-
- striven
|
|
149
|
-
- struck
|
|
150
|
-
- strung
|
|
151
|
-
- stuck
|
|
152
|
-
- stung
|
|
153
|
-
- stunk
|
|
154
|
-
- sung
|
|
155
|
-
- sunk
|
|
156
|
-
- swept
|
|
157
|
-
- swollen
|
|
158
|
-
- sworn
|
|
159
|
-
- swum
|
|
160
|
-
- swung
|
|
161
|
-
- taken
|
|
162
|
-
- taught
|
|
163
|
-
- thought
|
|
164
|
-
- thrived
|
|
165
|
-
- thrown
|
|
166
|
-
- thrust
|
|
167
|
-
- told
|
|
168
|
-
- torn
|
|
169
|
-
- trodden
|
|
170
|
-
- understood
|
|
171
|
-
- upheld
|
|
172
|
-
- upset
|
|
173
|
-
- wed
|
|
174
|
-
- wept
|
|
175
|
-
- withheld
|
|
176
|
-
- withstood
|
|
177
|
-
- woken
|
|
178
|
-
- won
|
|
179
|
-
- worn
|
|
180
|
-
- wound
|
|
181
|
-
- woven
|
|
182
|
-
- written
|
|
183
|
-
- wrung
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
Based on [write-good](https://github.com/btford/write-good).
|
|
2
|
-
|
|
3
|
-
> Naive linter for English prose for developers who can't write good and wanna learn to do other stuff good too.
|
|
4
|
-
|
|
5
|
-
```
|
|
6
|
-
The MIT License (MIT)
|
|
7
|
-
|
|
8
|
-
Copyright (c) 2014 Brian Ford
|
|
9
|
-
|
|
10
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
11
|
-
of this software and associated documentation files (the "Software"), to deal
|
|
12
|
-
in the Software without restriction, including without limitation the rights
|
|
13
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
14
|
-
copies of the Software, and to permit persons to whom the Software is
|
|
15
|
-
furnished to do so, subject to the following conditions:
|
|
16
|
-
|
|
17
|
-
The above copyright notice and this permission notice shall be included in all
|
|
18
|
-
copies or substantial portions of the Software.
|
|
19
|
-
|
|
20
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
21
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
22
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
23
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
24
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
25
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
26
|
-
SOFTWARE.
|
|
27
|
-
```
|
package/styles/write-good/So.yml
DELETED
|
@@ -1,221 +0,0 @@
|
|
|
1
|
-
extends: existence
|
|
2
|
-
message: "'%s' is too wordy."
|
|
3
|
-
ignorecase: true
|
|
4
|
-
level: warning
|
|
5
|
-
tokens:
|
|
6
|
-
- a number of
|
|
7
|
-
- abundance
|
|
8
|
-
- accede to
|
|
9
|
-
- accelerate
|
|
10
|
-
- accentuate
|
|
11
|
-
- accompany
|
|
12
|
-
- accomplish
|
|
13
|
-
- accorded
|
|
14
|
-
- accrue
|
|
15
|
-
- acquiesce
|
|
16
|
-
- acquire
|
|
17
|
-
- additional
|
|
18
|
-
- adjacent to
|
|
19
|
-
- adjustment
|
|
20
|
-
- admissible
|
|
21
|
-
- advantageous
|
|
22
|
-
- adversely impact
|
|
23
|
-
- advise
|
|
24
|
-
- aforementioned
|
|
25
|
-
- aggregate
|
|
26
|
-
- aircraft
|
|
27
|
-
- all of
|
|
28
|
-
- all things considered
|
|
29
|
-
- alleviate
|
|
30
|
-
- allocate
|
|
31
|
-
- along the lines of
|
|
32
|
-
- already existing
|
|
33
|
-
- alternatively
|
|
34
|
-
- amazing
|
|
35
|
-
- ameliorate
|
|
36
|
-
- anticipate
|
|
37
|
-
- apparent
|
|
38
|
-
- appreciable
|
|
39
|
-
- as a matter of fact
|
|
40
|
-
- as a means of
|
|
41
|
-
- as far as I'm concerned
|
|
42
|
-
- as of yet
|
|
43
|
-
- as to
|
|
44
|
-
- as yet
|
|
45
|
-
- ascertain
|
|
46
|
-
- assistance
|
|
47
|
-
- at the present time
|
|
48
|
-
- at this time
|
|
49
|
-
- attain
|
|
50
|
-
- attributable to
|
|
51
|
-
- authorize
|
|
52
|
-
- because of the fact that
|
|
53
|
-
- belated
|
|
54
|
-
- benefit from
|
|
55
|
-
- bestow
|
|
56
|
-
- by means of
|
|
57
|
-
- by virtue of
|
|
58
|
-
- by virtue of the fact that
|
|
59
|
-
- cease
|
|
60
|
-
- close proximity
|
|
61
|
-
- commence
|
|
62
|
-
- comply with
|
|
63
|
-
- concerning
|
|
64
|
-
- consequently
|
|
65
|
-
- consolidate
|
|
66
|
-
- constitutes
|
|
67
|
-
- demonstrate
|
|
68
|
-
- depart
|
|
69
|
-
- designate
|
|
70
|
-
- discontinue
|
|
71
|
-
- due to the fact that
|
|
72
|
-
- each and every
|
|
73
|
-
- economical
|
|
74
|
-
- eliminate
|
|
75
|
-
- elucidate
|
|
76
|
-
- employ
|
|
77
|
-
- endeavor
|
|
78
|
-
- enumerate
|
|
79
|
-
- equitable
|
|
80
|
-
- equivalent
|
|
81
|
-
- evaluate
|
|
82
|
-
- evidenced
|
|
83
|
-
- exclusively
|
|
84
|
-
- expedite
|
|
85
|
-
- expend
|
|
86
|
-
- expiration
|
|
87
|
-
- facilitate
|
|
88
|
-
- factual evidence
|
|
89
|
-
- feasible
|
|
90
|
-
- finalize
|
|
91
|
-
- first and foremost
|
|
92
|
-
- for all intents and purposes
|
|
93
|
-
- for the most part
|
|
94
|
-
- for the purpose of
|
|
95
|
-
- forfeit
|
|
96
|
-
- formulate
|
|
97
|
-
- have a tendency to
|
|
98
|
-
- honest truth
|
|
99
|
-
- however
|
|
100
|
-
- if and when
|
|
101
|
-
- impacted
|
|
102
|
-
- implement
|
|
103
|
-
- in a manner of speaking
|
|
104
|
-
- in a timely manner
|
|
105
|
-
- in a very real sense
|
|
106
|
-
- in accordance with
|
|
107
|
-
- in addition
|
|
108
|
-
- in all likelihood
|
|
109
|
-
- in an effort to
|
|
110
|
-
- in between
|
|
111
|
-
- in excess of
|
|
112
|
-
- in lieu of
|
|
113
|
-
- in light of the fact that
|
|
114
|
-
- in many cases
|
|
115
|
-
- in my opinion
|
|
116
|
-
- in order to
|
|
117
|
-
- in regard to
|
|
118
|
-
- in some instances
|
|
119
|
-
- in terms of
|
|
120
|
-
- in the case of
|
|
121
|
-
- in the event that
|
|
122
|
-
- in the final analysis
|
|
123
|
-
- in the nature of
|
|
124
|
-
- in the near future
|
|
125
|
-
- in the process of
|
|
126
|
-
- inception
|
|
127
|
-
- incumbent upon
|
|
128
|
-
- indicate
|
|
129
|
-
- indication
|
|
130
|
-
- initiate
|
|
131
|
-
- irregardless
|
|
132
|
-
- is applicable to
|
|
133
|
-
- is authorized to
|
|
134
|
-
- is responsible for
|
|
135
|
-
- it is
|
|
136
|
-
- it is essential
|
|
137
|
-
- it seems that
|
|
138
|
-
- it was
|
|
139
|
-
- magnitude
|
|
140
|
-
- maximum
|
|
141
|
-
- methodology
|
|
142
|
-
- minimize
|
|
143
|
-
- minimum
|
|
144
|
-
- modify
|
|
145
|
-
- monitor
|
|
146
|
-
- multiple
|
|
147
|
-
- necessitate
|
|
148
|
-
- nevertheless
|
|
149
|
-
- not certain
|
|
150
|
-
- not many
|
|
151
|
-
- not often
|
|
152
|
-
- not unless
|
|
153
|
-
- not unlike
|
|
154
|
-
- notwithstanding
|
|
155
|
-
- null and void
|
|
156
|
-
- numerous
|
|
157
|
-
- objective
|
|
158
|
-
- obligate
|
|
159
|
-
- obtain
|
|
160
|
-
- on the contrary
|
|
161
|
-
- on the other hand
|
|
162
|
-
- one particular
|
|
163
|
-
- optimum
|
|
164
|
-
- overall
|
|
165
|
-
- owing to the fact that
|
|
166
|
-
- participate
|
|
167
|
-
- particulars
|
|
168
|
-
- pass away
|
|
169
|
-
- pertaining to
|
|
170
|
-
- point in time
|
|
171
|
-
- portion
|
|
172
|
-
- possess
|
|
173
|
-
- preclude
|
|
174
|
-
- previously
|
|
175
|
-
- prior to
|
|
176
|
-
- prioritize
|
|
177
|
-
- procure
|
|
178
|
-
- proficiency
|
|
179
|
-
- provided that
|
|
180
|
-
- purchase
|
|
181
|
-
- put simply
|
|
182
|
-
- readily apparent
|
|
183
|
-
- refer back
|
|
184
|
-
- regarding
|
|
185
|
-
- relocate
|
|
186
|
-
- remainder
|
|
187
|
-
- remuneration
|
|
188
|
-
- requirement
|
|
189
|
-
- reside
|
|
190
|
-
- residence
|
|
191
|
-
- retain
|
|
192
|
-
- satisfy
|
|
193
|
-
- shall
|
|
194
|
-
- should you wish
|
|
195
|
-
- similar to
|
|
196
|
-
- solicit
|
|
197
|
-
- span across
|
|
198
|
-
- strategize
|
|
199
|
-
- subsequent
|
|
200
|
-
- substantial
|
|
201
|
-
- successfully complete
|
|
202
|
-
- sufficient
|
|
203
|
-
- terminate
|
|
204
|
-
- the month of
|
|
205
|
-
- the point I am trying to make
|
|
206
|
-
- therefore
|
|
207
|
-
- time period
|
|
208
|
-
- took advantage of
|
|
209
|
-
- transmit
|
|
210
|
-
- transpire
|
|
211
|
-
- type of
|
|
212
|
-
- until such time as
|
|
213
|
-
- utilization
|
|
214
|
-
- utilize
|
|
215
|
-
- validate
|
|
216
|
-
- various different
|
|
217
|
-
- what I mean to say is
|
|
218
|
-
- whether or not
|
|
219
|
-
- with respect to
|
|
220
|
-
- with the exception of
|
|
221
|
-
- witnessed
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
extends: existence
|
|
2
|
-
message: "'%s' is a weasel word!"
|
|
3
|
-
ignorecase: true
|
|
4
|
-
level: warning
|
|
5
|
-
tokens:
|
|
6
|
-
- clearly
|
|
7
|
-
- completely
|
|
8
|
-
- exceedingly
|
|
9
|
-
- excellent
|
|
10
|
-
- extremely
|
|
11
|
-
- fairly
|
|
12
|
-
- huge
|
|
13
|
-
- interestingly
|
|
14
|
-
- is a number
|
|
15
|
-
- largely
|
|
16
|
-
- mostly
|
|
17
|
-
- obviously
|
|
18
|
-
- quite
|
|
19
|
-
- relatively
|
|
20
|
-
- remarkably
|
|
21
|
-
- several
|
|
22
|
-
- significantly
|
|
23
|
-
- substantially
|
|
24
|
-
- surprisingly
|
|
25
|
-
- tiny
|
|
26
|
-
- usually
|
|
27
|
-
- various
|
|
28
|
-
- vast
|
|
29
|
-
- very
|
package/test/dashcam.test.js
DELETED
|
@@ -1,137 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Dashcam Class - Unit Tests
|
|
3
|
-
* Tests for the new Dashcam class
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
const { Dashcam } = require('../src/core');
|
|
7
|
-
|
|
8
|
-
// Mock TestDriver client
|
|
9
|
-
class MockTestDriver {
|
|
10
|
-
constructor(os = 'linux') {
|
|
11
|
-
this.os = os;
|
|
12
|
-
this.commands = [];
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
async exec(shell, command, timeout, silent) {
|
|
16
|
-
this.commands.push({ shell, command, timeout, silent });
|
|
17
|
-
|
|
18
|
-
// Mock responses
|
|
19
|
-
if (command.includes('npm prefix -g')) {
|
|
20
|
-
return this.os === 'windows'
|
|
21
|
-
? 'C:\\Users\\testdriver\\AppData\\Roaming\\npm'
|
|
22
|
-
: '/usr/local';
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
if (command.includes('stop')) {
|
|
26
|
-
return 'Recording stopped\nReplay URL: https://app.testdriver.ai/replay/abc123?share=xyz';
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
return 'OK';
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
wait(ms) {
|
|
33
|
-
return new Promise(resolve => setTimeout(resolve, ms));
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
async function testDashcamCreation() {
|
|
38
|
-
console.log('🧪 Test: Dashcam creation');
|
|
39
|
-
|
|
40
|
-
const client = new MockTestDriver();
|
|
41
|
-
const dashcam = new Dashcam(client);
|
|
42
|
-
|
|
43
|
-
console.assert(dashcam.client === client, 'Client should be stored');
|
|
44
|
-
console.assert(dashcam.recording === false, 'Should not be recording initially');
|
|
45
|
-
console.assert(dashcam._authenticated === false, 'Should not be authenticated initially');
|
|
46
|
-
|
|
47
|
-
console.log('✅ Dashcam creation test passed');
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
async function testDashcamWithOptions() {
|
|
51
|
-
console.log('\n🧪 Test: Dashcam with options');
|
|
52
|
-
|
|
53
|
-
const client = new MockTestDriver();
|
|
54
|
-
const dashcam = new Dashcam(client, {
|
|
55
|
-
apiKey: 'custom-key',
|
|
56
|
-
autoStart: true,
|
|
57
|
-
logs: [
|
|
58
|
-
{ type: 'file', path: '/tmp/test.log', name: 'Test Log' }
|
|
59
|
-
]
|
|
60
|
-
});
|
|
61
|
-
|
|
62
|
-
console.assert(dashcam.apiKey === 'custom-key', 'Custom API key should be used');
|
|
63
|
-
console.assert(dashcam.autoStart === true, 'Auto start should be enabled');
|
|
64
|
-
console.assert(dashcam.logs.length === 1, 'Logs should be stored');
|
|
65
|
-
|
|
66
|
-
console.log('✅ Dashcam options test passed');
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
async function testErrorOnMissingClient() {
|
|
70
|
-
console.log('\n🧪 Test: Error when client missing');
|
|
71
|
-
|
|
72
|
-
try {
|
|
73
|
-
new Dashcam();
|
|
74
|
-
console.error('❌ Should have thrown error');
|
|
75
|
-
process.exit(1);
|
|
76
|
-
} catch (error) {
|
|
77
|
-
console.assert(
|
|
78
|
-
error.message.includes('TestDriver client'),
|
|
79
|
-
'Error message should mention TestDriver client'
|
|
80
|
-
);
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
console.log('✅ Missing client error test passed');
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
async function testStopReturnsUrl() {
|
|
87
|
-
console.log('\n🧪 Test: Stop returns URL');
|
|
88
|
-
|
|
89
|
-
const client = new MockTestDriver();
|
|
90
|
-
const dashcam = new Dashcam(client);
|
|
91
|
-
|
|
92
|
-
dashcam.recording = true; // Simulate recording state
|
|
93
|
-
const url = await dashcam.stop();
|
|
94
|
-
|
|
95
|
-
console.assert(url !== null, 'URL should be returned');
|
|
96
|
-
console.assert(url.includes('replay'), 'URL should contain replay');
|
|
97
|
-
console.assert(dashcam.recording === false, 'Should stop recording');
|
|
98
|
-
|
|
99
|
-
console.log('✅ Stop returns URL test passed');
|
|
100
|
-
console.log(' URL:', url);
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
async function testIsRecording() {
|
|
104
|
-
console.log('\n🧪 Test: isRecording method');
|
|
105
|
-
|
|
106
|
-
const client = new MockTestDriver();
|
|
107
|
-
const dashcam = new Dashcam(client);
|
|
108
|
-
|
|
109
|
-
let recording = await dashcam.isRecording();
|
|
110
|
-
console.assert(recording === false, 'Should not be recording initially');
|
|
111
|
-
|
|
112
|
-
dashcam.recording = true;
|
|
113
|
-
recording = await dashcam.isRecording();
|
|
114
|
-
console.assert(recording === true, 'Should return recording state');
|
|
115
|
-
|
|
116
|
-
console.log('✅ isRecording test passed');
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
async function runAllTests() {
|
|
120
|
-
console.log('🚀 Running Dashcam class tests...\n');
|
|
121
|
-
|
|
122
|
-
try {
|
|
123
|
-
await testDashcamCreation();
|
|
124
|
-
await testDashcamWithOptions();
|
|
125
|
-
await testErrorOnMissingClient();
|
|
126
|
-
await testStopReturnsUrl();
|
|
127
|
-
await testIsRecording();
|
|
128
|
-
|
|
129
|
-
console.log('\n✅ All tests passed!');
|
|
130
|
-
} catch (error) {
|
|
131
|
-
console.error('\n❌ Test failed:', error.message);
|
|
132
|
-
console.error(error.stack);
|
|
133
|
-
process.exit(1);
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
runAllTests();
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
name: MCP Example Test
|
|
2
|
-
description: Test created using TestDriver MCP to navigate example.com
|
|
3
|
-
|
|
4
|
-
steps:
|
|
5
|
-
# Open Chrome browser and navigate to example.com
|
|
6
|
-
- exec:
|
|
7
|
-
code: Start-Process chrome "https://example.com"
|
|
8
|
-
language: pwsh
|
|
9
|
-
timeout: 5000
|
|
10
|
-
|
|
11
|
-
# Wait for the page to load
|
|
12
|
-
- wait-for-text:
|
|
13
|
-
text: Example Domain
|
|
14
|
-
timeout: 10000
|
|
15
|
-
|
|
16
|
-
# Assert that the Example Domain heading is visible
|
|
17
|
-
- assert:
|
|
18
|
-
expect: The text "Example Domain" is visible on the page
|
|
19
|
-
|
|
20
|
-
# Click on the "Learn more" link
|
|
21
|
-
- hover-text:
|
|
22
|
-
text: Learn more
|
|
23
|
-
action: click
|
|
24
|
-
|
|
25
|
-
# Wait for navigation to complete
|
|
26
|
-
- wait:
|
|
27
|
-
timeout: 2000
|
package/test/test_parser.js
DELETED
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
const chai = require("chai");
|
|
2
|
-
const expect = chai.expect;
|
|
3
|
-
const { interpolate } = require("../agent/lib/parser");
|
|
4
|
-
|
|
5
|
-
describe("interpolate", function () {
|
|
6
|
-
it("should replace variables in the string with values from the dictionary", function () {
|
|
7
|
-
const template = "Hello, ${name}!";
|
|
8
|
-
const vars = { name: "World" };
|
|
9
|
-
const result = interpolate(template, vars);
|
|
10
|
-
expect(result).to.equal("Hello, World!");
|
|
11
|
-
});
|
|
12
|
-
|
|
13
|
-
it("should replace multiple variables in the string", function () {
|
|
14
|
-
const template = "Hi, ${firstName} ${lastName}!";
|
|
15
|
-
const vars = { firstName: "Marcy", lastName: "the Dog" };
|
|
16
|
-
const result = interpolate(template, vars);
|
|
17
|
-
expect(result).to.equal("Hi, Marcy the Dog!");
|
|
18
|
-
});
|
|
19
|
-
|
|
20
|
-
it("should leave variables unchanged if they are not in the dictionary", function () {
|
|
21
|
-
const template = "Hi, ${name} ${surname}!";
|
|
22
|
-
const vars = { name: "John" };
|
|
23
|
-
const result = interpolate(template, vars);
|
|
24
|
-
expect(result).to.equal("Hi, John ${surname}!");
|
|
25
|
-
});
|
|
26
|
-
|
|
27
|
-
it("should return the original string if no variables are present", function () {
|
|
28
|
-
const template = "Hello, World!";
|
|
29
|
-
const vars = { name: "John" };
|
|
30
|
-
const result = interpolate(template, vars);
|
|
31
|
-
expect(result).to.equal("Hello, World!");
|
|
32
|
-
});
|
|
33
|
-
|
|
34
|
-
it("should handle an empty dictionary gracefully", function () {
|
|
35
|
-
const template = "Hi, ${name}!";
|
|
36
|
-
const vars = {};
|
|
37
|
-
const result = interpolate(template, vars);
|
|
38
|
-
expect(result).to.equal("Hi, ${name}!");
|
|
39
|
-
});
|
|
40
|
-
|
|
41
|
-
it("should not replace escaped variables", function () {
|
|
42
|
-
const template = "Hello, \\${name}!";
|
|
43
|
-
const vars = { name: "World" };
|
|
44
|
-
const result = interpolate(template, vars);
|
|
45
|
-
expect(result).to.equal("Hello, ${name}!");
|
|
46
|
-
});
|
|
47
|
-
});
|