import { expect, describe, test } from 'bun:test' import { globals } from '#prelude' describe('var and var?', () => { test('var? checks if a variable exists', async () => { await expect(`var? 'nada'`).toEvaluateTo(false, globals) await expect(`var? 'info'`).toEvaluateTo(false, globals) await expect(`abc = abc; var? 'abc'`).toEvaluateTo(true, globals) await expect(`var? 'var?'`).toEvaluateTo(true, globals) await expect(`var? 'dict'`).toEvaluateTo(true, globals) await expect(`var? dict`).toEvaluateTo(true, globals) }) test('var returns a value or null', async () => { await expect(`var 'nada'`).toEvaluateTo(null, globals) await expect(`var nada`).toEvaluateTo(null, globals) await expect(`var 'info'`).toEvaluateTo(null, globals) await expect(`abc = my-string; var 'abc'`).toEvaluateTo('my-string', globals) await expect(`abc = my-string; var abc`).toEvaluateTo(null, globals) }) }) describe('type predicates', () => { test('string? checks for string type', async () => { await expect(`string? 'hello'`).toEvaluateTo(true, globals) await expect(`string? 42`).toEvaluateTo(false, globals) }) test('number? checks for number type', async () => { await expect(`number? 42`).toEvaluateTo(true, globals) await expect(`number? 'hello'`).toEvaluateTo(false, globals) }) test('boolean? checks for boolean type', async () => { await expect(`boolean? true`).toEvaluateTo(true, globals) await expect(`boolean? 42`).toEvaluateTo(false, globals) }) test('array? checks for array type', async () => { await expect(`array? [1 2 3]`).toEvaluateTo(true, globals) await expect(`array? 42`).toEvaluateTo(false, globals) }) test('dict? checks for dict type', async () => { await expect(`dict? [a=1]`).toEvaluateTo(true, globals) await expect(`dict? []`).toEvaluateTo(false, globals) }) test('null? checks for null type', async () => { await expect(`null? null`).toEvaluateTo(true, globals) await expect(`null? 42`).toEvaluateTo(false, globals) }) test('some? checks for non-null', async () => { await expect(`some? 42`).toEvaluateTo(true, globals) await expect(`some? null`).toEvaluateTo(false, globals) }) }) describe('introspection', () => { test('type returns proper types', async () => { await expect(`type 'hello'`).toEvaluateTo('string', globals) await expect(`type 42`).toEvaluateTo('number', globals) await expect(`type true`).toEvaluateTo('boolean', globals) await expect(`type false`).toEvaluateTo('boolean', globals) await expect(`type null`).toEvaluateTo('null', globals) await expect(`type [1 2 3]`).toEvaluateTo('array', globals) await expect(`type [a=1 b=2]`).toEvaluateTo('dict', globals) }) test('inspect formats values', async () => { await expect(`inspect 'hello'`).toEvaluateTo("\u001b[32m'hello\u001b[32m'\u001b[0m", globals) }) test('describe describes values', async () => { await expect(`describe 'hello'`).toEvaluateTo("#", globals) }) })