import { describe, expect, it } from 'vitest'
import {
  DUNDER_MEMBER,
  PORTABLE_RESERVED_WORDS,
  RESERVED_BINDING_GLOBALS,
  RESERVED_ERROR_MEMBERS,
} from '@deepseek-ai/dsh-code-runtime'

/**
 * The seam owns the portable-identifier exclusion sets so every backend
 * enforces one contract: a namespace list valid on one backend is valid on
 * all. These assertions pin the shared membership backends import rather than
 * re-declare.
 */
describe('seam-owned portable identifier exclusions', () => {
  it('RESERVED_BINDING_GLOBALS covers each backend-owned slot', () => {
    expect(RESERVED_BINDING_GLOBALS.has('console')).toBe(true)
    expect(RESERVED_BINDING_GLOBALS.has('__dsh_main__')).toBe(true)
    expect(RESERVED_BINDING_GLOBALS.has('__builtins__')).toBe(true)
    expect(RESERVED_BINDING_GLOBALS.has('__name__')).toBe(true)
    expect(RESERVED_BINDING_GLOBALS.has('__debug__')).toBe(true)
    expect(RESERVED_BINDING_GLOBALS.has('tools')).toBe(false)
  })

  it('RESERVED_ERROR_MEMBERS covers the JS Error and Python exception-protocol members', () => {
    for (const name of ['name', 'message', 'stack', 'args', 'with_traceback', 'add_note']) {
      expect(RESERVED_ERROR_MEMBERS.has(name)).toBe(true)
    }
    expect(RESERVED_ERROR_MEMBERS.has('code')).toBe(false)
  })

  it('DUNDER_MEMBER matches dunder-form names only', () => {
    expect(DUNDER_MEMBER.test('__dict__')).toBe(true)
    expect(DUNDER_MEMBER.test('__init__')).toBe(true)
    expect(DUNDER_MEMBER.test('_private')).toBe(false)
    expect(DUNDER_MEMBER.test('name')).toBe(false)
    expect(DUNDER_MEMBER.test('__mid')).toBe(false)
    // `__` has an empty middle — not a real CPython dunder, so not matched.
    expect(DUNDER_MEMBER.test('__')).toBe(false)
    // `____` also has an empty middle between the two `__` pairs — not matched.
    expect(DUNDER_MEMBER.test('____')).toBe(false)
    // A single character between the pairs is the shortest real dunder form.
    expect(DUNDER_MEMBER.test('__x__')).toBe(true)
  })

  it('PORTABLE_RESERVED_WORDS is the union of ECMAScript and Python reserved words', () => {
    // ECMAScript-only keyword.
    expect(PORTABLE_RESERVED_WORDS.has('function')).toBe(true)
    // Python-only keyword — refused here so the list stays portable.
    expect(PORTABLE_RESERVED_WORDS.has('lambda')).toBe(true)
    expect(PORTABLE_RESERVED_WORDS.has('nonlocal')).toBe(true)
    // Shared keyword.
    expect(PORTABLE_RESERVED_WORDS.has('class')).toBe(true)
    // Ordinary identifier is not reserved.
    expect(PORTABLE_RESERVED_WORDS.has('tools')).toBe(false)
  })
})
