diff --git a/bun.lock b/bun.lock index e167948..1817f86 100644 --- a/bun.lock +++ b/bun.lock @@ -38,7 +38,7 @@ "@effect/build-utils": "0.7.8", "@effect/eslint-plugin": "0.2.0", "@effect/language-service": "0.2.0", - "@effect/vitest": "0.17.3", + "@effect/vitest": "0.19.0", "@eslint/compat": "1.2.5", "@eslint/eslintrc": "3.2.0", "@eslint/js": "9.19.0", @@ -59,7 +59,7 @@ "tsx": "4.19.2", "typescript": "5.7.3", "vite": "^6.1.0", - "vitest": "3.0.4", + "vitest": "3.0.7", }, }, }, @@ -150,7 +150,7 @@ "@effect/typeclass": ["@effect/typeclass@0.31.12", "", { "peerDependencies": { "effect": "^3.12.12" } }, "sha512-iyg8EJgZ7PS4hFnkWFtyeaXIH4544tLprmerRYFjgGHMsqxoorTfHd2N01inXd3stUgcGiHoVy1DDAxWKLomkQ=="], - "@effect/vitest": ["@effect/vitest@0.17.3", "", { "peerDependencies": { "effect": "^3.12.7", "vitest": "^2.0.5" } }, "sha512-sRLJ5tl/i2hnNr9NOr1Xu+uOmOraRmUZyt8pOB/83NevcKk9dKeWcxVitg4sVgpcWWfC3vzIIaM6J9DMqaCYuw=="], + "@effect/vitest": ["@effect/vitest@0.19.0", "", { "peerDependencies": { "effect": "^3.13.2", "vitest": "^3.0.0" } }, "sha512-KkyCAIpEl0S9HheF4+a6UrLW5cgn6W+H7JlMPt+pZiehkBQHVIdsVuzRpk/ZFdgVJNMHE+Xh2ZOKPoGJZnu0Fg=="], "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.23.1", "", { "os": "aix", "cpu": "ppc64" }, "sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ=="], @@ -500,19 +500,19 @@ "@vitejs/plugin-react-swc": ["@vitejs/plugin-react-swc@3.8.0", "", { "dependencies": { "@swc/core": "^1.10.15" }, "peerDependencies": { "vite": "^4 || ^5 || ^6" } }, "sha512-T4sHPvS+DIqDP51ifPqa9XIRAz/kIvIi8oXcnOZZgHmMotgmmdxe/DD5tMFlt5nuIRzT0/QuiwmKlH0503Aapw=="], - "@vitest/expect": ["@vitest/expect@3.0.4", "", { "dependencies": { "@vitest/spy": "3.0.4", "@vitest/utils": "3.0.4", "chai": "^5.1.2", "tinyrainbow": "^2.0.0" } }, "sha512-Nm5kJmYw6P2BxhJPkO3eKKhGYKRsnqJqf+r0yOGRKpEP+bSCBDsjXgiu1/5QFrnPMEgzfC38ZEjvCFgaNBC0Eg=="], + "@vitest/expect": ["@vitest/expect@3.0.7", "", { "dependencies": { "@vitest/spy": "3.0.7", "@vitest/utils": "3.0.7", "chai": "^5.2.0", "tinyrainbow": "^2.0.0" } }, "sha512-QP25f+YJhzPfHrHfYHtvRn+uvkCFCqFtW9CktfBxmB+25QqWsx7VB2As6f4GmwllHLDhXNHvqedwhvMmSnNmjw=="], - "@vitest/mocker": ["@vitest/mocker@3.0.4", "", { "dependencies": { "@vitest/spy": "3.0.4", "estree-walker": "^3.0.3", "magic-string": "^0.30.17" }, "peerDependencies": { "msw": "^2.4.9", "vite": "^5.0.0 || ^6.0.0" }, "optionalPeers": ["msw", "vite"] }, "sha512-gEef35vKafJlfQbnyOXZ0Gcr9IBUsMTyTLXsEQwuyYAerpHqvXhzdBnDFuHLpFqth3F7b6BaFr4qV/Cs1ULx5A=="], + "@vitest/mocker": ["@vitest/mocker@3.0.7", "", { "dependencies": { "@vitest/spy": "3.0.7", "estree-walker": "^3.0.3", "magic-string": "^0.30.17" }, "peerDependencies": { "msw": "^2.4.9", "vite": "^5.0.0 || ^6.0.0" }, "optionalPeers": ["msw", "vite"] }, "sha512-qui+3BLz9Eonx4EAuR/i+QlCX6AUZ35taDQgwGkK/Tw6/WgwodSrjN1X2xf69IA/643ZX5zNKIn2svvtZDrs4w=="], - "@vitest/pretty-format": ["@vitest/pretty-format@3.0.5", "", { "dependencies": { "tinyrainbow": "^2.0.0" } }, "sha512-CjUtdmpOcm4RVtB+up8r2vVDLR16Mgm/bYdkGFe3Yj/scRfCpbSi2W/BDSDcFK7ohw8UXvjMbOp9H4fByd/cOA=="], + "@vitest/pretty-format": ["@vitest/pretty-format@3.0.7", "", { "dependencies": { "tinyrainbow": "^2.0.0" } }, "sha512-CiRY0BViD/V8uwuEzz9Yapyao+M9M008/9oMOSQydwbwb+CMokEq3XVaF3XK/VWaOK0Jm9z7ENhybg70Gtxsmg=="], - "@vitest/runner": ["@vitest/runner@3.0.4", "", { "dependencies": { "@vitest/utils": "3.0.4", "pathe": "^2.0.2" } }, "sha512-dKHzTQ7n9sExAcWH/0sh1elVgwc7OJ2lMOBrAm73J7AH6Pf9T12Zh3lNE1TETZaqrWFXtLlx3NVrLRb5hCK+iw=="], + "@vitest/runner": ["@vitest/runner@3.0.7", "", { "dependencies": { "@vitest/utils": "3.0.7", "pathe": "^2.0.3" } }, "sha512-WeEl38Z0S2ZcuRTeyYqaZtm4e26tq6ZFqh5y8YD9YxfWuu0OFiGFUbnxNynwLjNRHPsXyee2M9tV7YxOTPZl2g=="], - "@vitest/snapshot": ["@vitest/snapshot@3.0.4", "", { "dependencies": { "@vitest/pretty-format": "3.0.4", "magic-string": "^0.30.17", "pathe": "^2.0.2" } }, "sha512-+p5knMLwIk7lTQkM3NonZ9zBewzVp9EVkVpvNta0/PlFWpiqLaRcF4+33L1it3uRUCh0BGLOaXPPGEjNKfWb4w=="], + "@vitest/snapshot": ["@vitest/snapshot@3.0.7", "", { "dependencies": { "@vitest/pretty-format": "3.0.7", "magic-string": "^0.30.17", "pathe": "^2.0.3" } }, "sha512-eqTUryJWQN0Rtf5yqCGTQWsCFOQe4eNz5Twsu21xYEcnFJtMU5XvmG0vgebhdLlrHQTSq5p8vWHJIeJQV8ovsA=="], - "@vitest/spy": ["@vitest/spy@3.0.4", "", { "dependencies": { "tinyspy": "^3.0.2" } }, "sha512-sXIMF0oauYyUy2hN49VFTYodzEAu744MmGcPR3ZBsPM20G+1/cSW/n1U+3Yu/zHxX2bIDe1oJASOkml+osTU6Q=="], + "@vitest/spy": ["@vitest/spy@3.0.7", "", { "dependencies": { "tinyspy": "^3.0.2" } }, "sha512-4T4WcsibB0B6hrKdAZTM37ekuyFZt2cGbEGd2+L0P8ov15J1/HUsUaqkXEQPNAWr4BtPPe1gI+FYfMHhEKfR8w=="], - "@vitest/utils": ["@vitest/utils@3.0.4", "", { "dependencies": { "@vitest/pretty-format": "3.0.4", "loupe": "^3.1.2", "tinyrainbow": "^2.0.0" } }, "sha512-8BqC1ksYsHtbWH+DfpOAKrFw3jl3Uf9J7yeFh85Pz52IWuh1hBBtyfEbRNNZNjl8H8A5yMLH9/t+k7HIKzQcZQ=="], + "@vitest/utils": ["@vitest/utils@3.0.7", "", { "dependencies": { "@vitest/pretty-format": "3.0.7", "loupe": "^3.1.3", "tinyrainbow": "^2.0.0" } }, "sha512-xePVpCRfooFX3rANQjwoditoXgWb1MaFbzmGuPP59MK6i13mrnDw/yEIyJudLeW6/38mCNcwCiJIGmpDPibAIg=="], "acorn": ["acorn@8.14.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA=="], @@ -1238,9 +1238,9 @@ "vite": ["vite@6.1.0", "", { "dependencies": { "esbuild": "^0.24.2", "postcss": "^8.5.1", "rollup": "^4.30.1" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-RjjMipCKVoR4hVfPY6GQTgveinjNuyLw+qruksLDvA5ktI1150VmcMBKmQaEWJhg/j6Uaf6dNCNA0AfdzUb/hQ=="], - "vite-node": ["vite-node@3.0.4", "", { "dependencies": { "cac": "^6.7.14", "debug": "^4.4.0", "es-module-lexer": "^1.6.0", "pathe": "^2.0.2", "vite": "^5.0.0 || ^6.0.0" }, "bin": { "vite-node": "vite-node.mjs" } }, "sha512-7JZKEzcYV2Nx3u6rlvN8qdo3QV7Fxyt6hx+CCKz9fbWxdX5IvUOmTWEAxMrWxaiSf7CKGLJQ5rFu8prb/jBjOA=="], + "vite-node": ["vite-node@3.0.7", "", { "dependencies": { "cac": "^6.7.14", "debug": "^4.4.0", "es-module-lexer": "^1.6.0", "pathe": "^2.0.3", "vite": "^5.0.0 || ^6.0.0" }, "bin": { "vite-node": "vite-node.mjs" } }, "sha512-2fX0QwX4GkkkpULXdT1Pf4q0tC1i1lFOyseKoonavXUNlQ77KpW2XqBGGNIm/J4Ows4KxgGJzDguYVPKwG/n5A=="], - "vitest": ["vitest@3.0.4", "", { "dependencies": { "@vitest/expect": "3.0.4", "@vitest/mocker": "3.0.4", "@vitest/pretty-format": "^3.0.4", "@vitest/runner": "3.0.4", "@vitest/snapshot": "3.0.4", "@vitest/spy": "3.0.4", "@vitest/utils": "3.0.4", "chai": "^5.1.2", "debug": "^4.4.0", "expect-type": "^1.1.0", "magic-string": "^0.30.17", "pathe": "^2.0.2", "std-env": "^3.8.0", "tinybench": "^2.9.0", "tinyexec": "^0.3.2", "tinypool": "^1.0.2", "tinyrainbow": "^2.0.0", "vite": "^5.0.0 || ^6.0.0", "vite-node": "3.0.4", "why-is-node-running": "^2.3.0" }, "peerDependencies": { "@edge-runtime/vm": "*", "@types/debug": "^4.1.12", "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "@vitest/browser": "3.0.4", "@vitest/ui": "3.0.4", "happy-dom": "*", "jsdom": "*" }, "optionalPeers": ["@edge-runtime/vm", "@types/debug", "@types/node", "@vitest/browser", "@vitest/ui", "happy-dom", "jsdom"], "bin": { "vitest": "vitest.mjs" } }, "sha512-6XG8oTKy2gnJIFTHP6LD7ExFeNLxiTkK3CfMvT7IfR8IN+BYICCf0lXUQmX7i7JoxUP8QmeP4mTnWXgflu4yjw=="], + "vitest": ["vitest@3.0.7", "", { "dependencies": { "@vitest/expect": "3.0.7", "@vitest/mocker": "3.0.7", "@vitest/pretty-format": "^3.0.7", "@vitest/runner": "3.0.7", "@vitest/snapshot": "3.0.7", "@vitest/spy": "3.0.7", "@vitest/utils": "3.0.7", "chai": "^5.2.0", "debug": "^4.4.0", "expect-type": "^1.1.0", "magic-string": "^0.30.17", "pathe": "^2.0.3", "std-env": "^3.8.0", "tinybench": "^2.9.0", "tinyexec": "^0.3.2", "tinypool": "^1.0.2", "tinyrainbow": "^2.0.0", "vite": "^5.0.0 || ^6.0.0", "vite-node": "3.0.7", "why-is-node-running": "^2.3.0" }, "peerDependencies": { "@edge-runtime/vm": "*", "@types/debug": "^4.1.12", "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "@vitest/browser": "3.0.7", "@vitest/ui": "3.0.7", "happy-dom": "*", "jsdom": "*" }, "optionalPeers": ["@edge-runtime/vm", "@types/debug", "@types/node", "@vitest/browser", "@vitest/ui", "happy-dom", "jsdom"], "bin": { "vitest": "vitest.mjs" } }, "sha512-IP7gPK3LS3Fvn44x30X1dM9vtawm0aesAa2yBIZ9vQf+qB69NXC5776+Qmcr7ohUXIQuLhk7xQR0aSUIDPqavg=="], "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], @@ -1282,10 +1282,6 @@ "@typescript-eslint/typescript-estree/semver": ["semver@7.7.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA=="], - "@vitest/snapshot/@vitest/pretty-format": ["@vitest/pretty-format@3.0.4", "", { "dependencies": { "tinyrainbow": "^2.0.0" } }, "sha512-ts0fba+dEhK2aC9PFuZ9LTpULHpY/nd6jhAQ5IMU7Gaj7crPCTdCFfgvXxruRBLFS+MLraicCuFXxISEq8C93g=="], - - "@vitest/utils/@vitest/pretty-format": ["@vitest/pretty-format@3.0.4", "", { "dependencies": { "tinyrainbow": "^2.0.0" } }, "sha512-ts0fba+dEhK2aC9PFuZ9LTpULHpY/nd6jhAQ5IMU7Gaj7crPCTdCFfgvXxruRBLFS+MLraicCuFXxISEq8C93g=="], - "chokidar/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], "eslint-import-resolver-node/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], diff --git a/package.json b/package.json index a8742c1..81079b5 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,7 @@ "lint": "eslint \"**/{src,test,examples,scripts,dtslint}/**/*.{ts,mjs}\"", "lint-fix": "pnpm lint --fix", "test": "bun test", + "vitest": "vitest", "coverage": "bun test --coverage", "repl": " bun src/services/cli.ts repl", "dev": "vite dev", @@ -52,7 +53,7 @@ "@effect/build-utils": "0.7.8", "@effect/eslint-plugin": "0.2.0", "@effect/language-service": "0.2.0", - "@effect/vitest": "0.17.3", + "@effect/vitest": "0.19.0", "@eslint/compat": "1.2.5", "@eslint/eslintrc": "3.2.0", "@eslint/js": "9.19.0", @@ -73,7 +74,7 @@ "tsx": "4.19.2", "typescript": "5.7.3", "vite": "^6.1.0", - "vitest": "3.0.4" + "vitest": "3.0.7" }, "effect": { "generateExports": { diff --git a/src/services/object/builtins.ts b/src/services/object/builtins.ts index 60a390b..9298a74 100644 --- a/src/services/object/builtins.ts +++ b/src/services/object/builtins.ts @@ -114,8 +114,11 @@ export const builtInFnMap = { const firstArg = args[0]; return yield* Match.value(firstArg).pipe( - Match.tag("StringObj", (strObj) => - Effect.succeed(IntegerObj.make({ value: strObj.value.length })), + Match.tag("StringObj", ({ value }) => + Effect.succeed(IntegerObj.make({ value: value.length })), + ), + Match.tag("ArrayObj", ({ elements }) => + Effect.succeed(IntegerObj.make({ value: elements.length })), ), Match.orElse(() => Effect.succeed( diff --git a/src/tests/property/eval/eval.test.ts b/src/tests/property/eval/eval.test.ts new file mode 100644 index 0000000..9978599 --- /dev/null +++ b/src/tests/property/eval/eval.test.ts @@ -0,0 +1,44 @@ +import { BooleanObj } from "@/schemas/objs/bool"; +import { IntegerObj } from "@/schemas/objs/int"; +import { Evaluator } from "@/services/evaluator"; +import { OPERATOR_TO_FUNCTION_MAP } from "@/services/evaluator/constants"; +import { it } from "@effect/vitest"; +import { Effect, Schema } from "effect"; +import { logDebug } from "effect/Effect"; + +// Testing a successful division +it.prop( + "prefix operator", + [ + Schema.Number.pipe(Schema.int()), + Schema.Literal("+"), + Schema.Number.pipe(Schema.int()), + ], + ([left, operator, right]) => + Effect.gen(function* () { + const evaluator = yield* Evaluator; + const evaluation = yield* evaluator.run(`${left} ${operator} ${right}`); + const { value } = yield* Schema.decodeUnknown( + Schema.Union(IntegerObj, BooleanObj), + )(evaluation); + yield* logDebug("value", value); + const jsValue = OPERATOR_TO_FUNCTION_MAP[operator](left, right); + yield* logDebug("jsValue", jsValue); + return true; + // if (value !== jsValue) + // throw new Error(`expected ${jsValue}, got ${value}`); + }), +); + + SELECT + co.status, + co.company, + co.affiliateComission + FROM + `cartorder` co + LEFT JOIN `account` a ON co.`accountId` = a.`accountId` + LEFT JOIN customer c ON c.customerId = a.customerId + WHERE + co.`referringAffiliateId` = 4016 + AND c.customerId = 48994 + AND co.wc_status = 'completed' diff --git a/src/tests/property/pbt/pbt.test.ts b/src/tests/property/pbt/pbt.test.ts new file mode 100644 index 0000000..4c19f82 --- /dev/null +++ b/src/tests/property/pbt/pbt.test.ts @@ -0,0 +1,43 @@ +import { it } from "@effect/vitest"; +import { Schema } from "effect"; + +class Letter extends Schema.Class("Letter")({ + name: Schema.String.pipe( + Schema.minLength(1), + Schema.filter((s) => s.match(/^[a-z]+$/) !== null), + ), + age: Schema.Int.pipe(Schema.between(1, 77)), +}) { + static Array = Schema.Array(this); +} + +function sortLetters(letters: Schema.Schema.Type) { + const clonedLetters = [...letters]; + return clonedLetters.sort( + (la, lb) => + la.age - lb.age || la.name.codePointAt(0)! - lb.name.codePointAt(0)!, + ); +} + +it.prop( + "day #1: should properly sort letters", + [Letter.Array], + ([unsortedLetters]) => { + const letters = sortLetters(unsortedLetters); + for (let i = 1; i < letters.length; ++i) { + const prev = letters[i - 1]; + const curr = letters[i]; + if (prev.age < curr.age) continue; // properly ordered + if (prev.age > curr.age) throw new Error("Invalid on age"); + if (prev.name > curr.name) throw new Error("Invalid on name"); + } + }, + { + fails: false, + fastCheck: { + seed: 1485455336, + path: "352:3:7:9:9:13:12:11", + endOnFailure: true, + }, + }, +); diff --git a/vitest.config.ts b/vitest.config.ts index b519527..1b7c8a2 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -1,18 +1,18 @@ -import path from "path" -import { defineConfig } from "vitest/config" +import path from "node:path"; +import { defineConfig } from "vitest/config"; export default defineConfig({ - plugins: [ - ], - test: { - setupFiles: [path.join(__dirname, "setupTests.ts")], - include: ["./test/**/*.test.ts"], - globals: true - }, - resolve: { - alias: { - "@template/basic/test": path.join(__dirname, "test"), - "@template/basic": path.join(__dirname, "src") - } - } -}) + plugins: [], + test: { + // setupFiles: [path.join(__dirname, "setupTests.ts")], + include: ["./src/tests/property/**/*.test.ts"], + globals: true, + }, + resolve: { + alias: { + "@template/basic/test": path.join(__dirname, "test"), + "@template/basic": path.join(__dirname, "src"), + "@": path.resolve(__dirname, "./src"), + }, + }, +});