import { describe, expect, test } from 'bun:test' import { windowsPathToPosixPath, posixPathToWindowsPath } from '../windowsPaths' // ─── windowsPathToPosixPath ──────────────────────────────────────────── describe('windowsPathToPosixPath', () => { test('converts drive letter path to posix', () => { expect(windowsPathToPosixPath('C:\\Users\\foo')).toBe('/c/Users/foo') }) test('lowercases the drive letter', () => { expect(windowsPathToPosixPath('D:\\Work\\project')).toBe('/d/Work/project') }) test('handles lowercase drive letter input', () => { expect(windowsPathToPosixPath('e:\\data')).toBe('/e/data') }) test('converts UNC path', () => { expect(windowsPathToPosixPath('\\\\server\\share\\dir')).toBe( '//server/share/dir', ) }) test('converts root drive path', () => { expect(windowsPathToPosixPath('D:\\')).toBe('/d/') }) test('converts relative path by flipping backslashes', () => { expect(windowsPathToPosixPath('src\\main.ts')).toBe('src/main.ts') }) test('handles forward slashes in windows drive path', () => { // The regex matches both / and \\ after drive letter expect(windowsPathToPosixPath('C:/Users/foo')).toBe('/c/Users/foo') }) test('already-posix relative path passes through', () => { expect(windowsPathToPosixPath('src/main.ts')).toBe('src/main.ts') }) test('handles deeply nested path', () => { expect( windowsPathToPosixPath( 'C:\\Users\\me\\Documents\\project\\src\\index.ts', ), ).toBe('/c/Users/me/Documents/project/src/index.ts') }) }) // ─── posixPathToWindowsPath ──────────────────────────────────────────── describe('posixPathToWindowsPath', () => { test('converts MSYS2/Git Bash drive path to windows', () => { expect(posixPathToWindowsPath('/c/Users/foo')).toBe('C:\\Users\\foo') }) test('uppercases the drive letter', () => { expect(posixPathToWindowsPath('/d/Work/project')).toBe('D:\\Work\\project') }) test('converts cygdrive path', () => { expect(posixPathToWindowsPath('/cygdrive/d/work')).toBe('D:\\work') }) test('converts cygdrive root path', () => { expect(posixPathToWindowsPath('/cygdrive/c/')).toBe('C:\\') }) test('converts UNC posix path to windows UNC', () => { expect(posixPathToWindowsPath('//server/share/dir')).toBe( '\\\\server\\share\\dir', ) }) test('converts root drive posix path', () => { expect(posixPathToWindowsPath('/d/')).toBe('D:\\') }) test('converts bare drive mount (no trailing slash)', () => { // /d matches the regex ^\/([A-Za-z])(\/|$) where $2 is empty expect(posixPathToWindowsPath('/d')).toBe('D:\\') }) test('converts relative path by flipping forward slashes', () => { expect(posixPathToWindowsPath('src/main.ts')).toBe('src\\main.ts') }) test('handles already-windows relative path', () => { // No leading / or //, just flips / to backslash expect(posixPathToWindowsPath('foo\\bar')).toBe('foo\\bar') }) }) // ─── round-trip conversions ──────────────────────────────────────────── describe('round-trip conversions', () => { test('drive path round-trips windows -> posix -> windows', () => { const original = 'C:\\Users\\foo\\bar' const posix = windowsPathToPosixPath(original) const back = posixPathToWindowsPath(posix) expect(back).toBe(original) }) test('drive path round-trips posix -> windows -> posix', () => { const original = '/c/Users/foo/bar' const win = posixPathToWindowsPath(original) const back = windowsPathToPosixPath(win) expect(back).toBe(original) }) })