From 42f8c401dc9519bc8b2d386ce9eda072144a46d0 Mon Sep 17 00:00:00 2001 From: Akshay Nair Date: Fri, 13 Jan 2023 19:40:15 +0530 Subject: feat: refactors test runner --- examples/test-runner.ts | 50 +++++++++++++++++++++++++++++------------------- src/eval-env/builtins.ts | 1 + src/eval-env/test.ts | 13 ++++++------- src/eval.ts | 19 ++++++------------ src/index.ts | 3 ++- src/util.ts | 11 +++++++++++ stdlib/test.ts | 1 + 7 files changed, 57 insertions(+), 41 deletions(-) diff --git a/examples/test-runner.ts b/examples/test-runner.ts index 3302fbb..081dede 100644 --- a/examples/test-runner.ts +++ b/examples/test-runner.ts @@ -1,30 +1,40 @@ -import { Do, Kind1 } from '../stdlib/effect' -import { Print, PutStringLn } from '../stdlib/stdio' +import { Do } from '../stdlib/effect' +import { PutStringLn } from '../stdlib/stdio' import { SetEvalEnvironment } from '../stdlib/sys' import { Test, Assert } from '../stdlib/test' import { Equals, Not } from '../stdlib/util' -interface PrintK extends Kind1 { - return: Print -} +type testSomeStuff = Do<[ + PutStringLn<"Some Stuff">, -export type main = [ - SetEvalEnvironment<'test.node'>, - - PutStringLn<"Running tests...">, + Test<"should do some stuff", [ + Assert>, + Assert>>, + ]>, - Do<[ - Test<"should do some stuff", [ - Assert>, - Assert>>, - ]>, + Test<"bing bong, bing bing bong", [ + Assert>, + ]>, +]> - Test<"hello world", [ - Assert>, - ]>, +type testSomeMoreStuff = Do<[ + PutStringLn<"Other stuff?">, - Test<"should do some other stuff", [ - Assert>, - ]>, + Test<"should do some other stuff", [ + Assert>, ]>, + + // Test<"this'll fail fo sho", [ + // Assert>, + // ]>, +]> + +export type main = [ + // Update env to node with test helpers + SetEvalEnvironment<'test.node'>, + + PutStringLn<"=== Running tests... ===\n">, + + testSomeStuff, + testSomeMoreStuff, ] diff --git a/src/eval-env/builtins.ts b/src/eval-env/builtins.ts index 3adde06..f9c4ce8 100644 --- a/src/eval-env/builtins.ts +++ b/src/eval-env/builtins.ts @@ -1,5 +1,6 @@ import { Type } from 'ts-morph' import { Ctx } from "../types" +import { evalList } from '../util' export default (ctx: Ctx, args: Type[]) => ({ SetEvalEnvironment: async () => { diff --git a/src/eval-env/test.ts b/src/eval-env/test.ts index c394752..eddf366 100644 --- a/src/eval-env/test.ts +++ b/src/eval-env/test.ts @@ -1,31 +1,30 @@ import { Type } from 'ts-morph' import { Ctx } from '../types' -export const cleanup = () => {} - export default (ctx: Ctx, args: Type[]) => ({ Test: async () => { const [msg, effs] = args - process.stdout.write(` - ${ctx.getTypeValue(msg)}`) + process.stdout.write(` - ${ctx.getTypeValue(msg)} `) try { for (const eff of effs?.getTupleElements() ?? []) { await ctx.evaluateType(ctx, eff) } - console.log(' [✓]') + console.log('[✓]') } catch(e) { - console.log(' [TEST FAILED]') + console.log('[TEST FAILED]') throw e } + return [] }, Assert: async () => { - const [b] = args - if (!ctx.getTypeValue(b)) { + if (!ctx.getTypeValue(args[0])) { throw new Error('Assertion failed') } + return [] }, }) diff --git a/src/eval.ts b/src/eval.ts index fdffed7..2b93e49 100644 --- a/src/eval.ts +++ b/src/eval.ts @@ -6,7 +6,7 @@ import * as builtins from './eval-env/builtins' type EffDefn = { default: (ctx: Ctx, args: Type[]) => Record Promise>, - cleanup: () => void, + cleanup?: () => void, } const mergeEffDefns = (a: EffDefn, b: EffDefn): EffDefn => ({ default: (ctx: Ctx, args: Type[]) => ({ @@ -14,13 +14,13 @@ const mergeEffDefns = (a: EffDefn, b: EffDefn): EffDefn => ({ ...b.default(ctx, args), }), cleanup: () => { - a.cleanup() - b.cleanup() + a.cleanup?.() + b.cleanup?.() }, }) -const cleanupActions = new Set<() => void>() -export const cleanup = () => cleanupActions.forEach(f => f()) +const cleanupActions = new Set void)>() +export const cleanup = () => cleanupActions.forEach(f => f?.()) let prevEnv: string @@ -28,6 +28,7 @@ export const evaluateType = async ( ctx: Ctx, effTyp: Type ): Promise => { + // TODO: base type check const name = effTyp.getSymbol()?.getName() const args = effTyp.getTypeArguments() @@ -67,11 +68,3 @@ export const evaluateType = async ( }, }) } - -export const evalList = async (ctx: Ctx, effectTyps: Type[]) => { - const effectResults: string[] = [] - for (const item of effectTyps ?? []) { - effectResults.push(...(await evaluateType(ctx, item))) - } - return effectResults -} diff --git a/src/index.ts b/src/index.ts index 01420c8..a144c57 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,6 +1,7 @@ import { program } from 'commander' import { createContext } from './context' -import { cleanup, evalList } from './eval' +import { cleanup } from './eval' +import { evalList } from './util' const main = () => { program diff --git a/src/util.ts b/src/util.ts index 136815e..13bdb35 100644 --- a/src/util.ts +++ b/src/util.ts @@ -1,4 +1,15 @@ +import { Type } from "ts-morph" +import { Ctx } from "./types" + export const match = ( k: K | undefined, pattern: { [key in K | '_']: () => R } ) => (k && pattern[k] ? pattern[k]() : pattern._()) + +export const evalList = async (ctx: Ctx, effectTyps: Type[]) => { + const effectResults: string[] = [] + for (const item of effectTyps ?? []) { + effectResults.push(...(await ctx.evaluateType(ctx, item))) + } + return effectResults +} diff --git a/stdlib/test.ts b/stdlib/test.ts index 49c6e0e..7497f7b 100644 --- a/stdlib/test.ts +++ b/stdlib/test.ts @@ -2,6 +2,7 @@ import { Effect } from "./effect"; export interface Config { compileTimeTestFailures: false + stopAtFailure: true // TODO: stopAtFailure } type Assertion = Config['compileTimeTestFailures'] extends true ? true : boolean -- cgit v1.3.1