import { describe, expect, test } from 'bun:test' import { z } from 'zod/v4' import { semanticNumber } from '../semanticNumber' describe('semanticNumber', () => { test('parses number 42', () => { expect(semanticNumber().parse(42)).toBe(42) }) test('parses number 0', () => { expect(semanticNumber().parse(0)).toBe(0) }) test('parses negative number -5', () => { expect(semanticNumber().parse(-5)).toBe(-5) }) test('parses float 3.14', () => { expect(semanticNumber().parse(3.14)).toBeCloseTo(3.14) }) test("parses string '42' to 42", () => { expect(semanticNumber().parse('42')).toBe(42) }) test("parses string '-7.5' to -7.5", () => { expect(semanticNumber().parse('-7.5')).toBe(-7.5) }) test("rejects string 'abc'", () => { expect(() => semanticNumber().parse('abc')).toThrow() }) test("rejects empty string ''", () => { expect(() => semanticNumber().parse('')).toThrow() }) test('rejects null', () => { expect(() => semanticNumber().parse(null)).toThrow() }) test('rejects boolean true', () => { expect(() => semanticNumber().parse(true)).toThrow() }) test('works with custom inner schema (z.number().int().min(0))', () => { const schema = semanticNumber(z.number().int().min(0)) expect(schema.parse(5)).toBe(5) expect(schema.parse('10')).toBe(10) expect(() => schema.parse(-1)).toThrow() }) })