const { join } = require('path')
const { Runfiles } = require('@bazel/runfiles')

function describe(name, fn) {
    console.log(name)
    fn()
}
function it(name, fn) {
    console.log(`  ${name}`)
    fn()
}

function assert(t, msg) {
    if (!t) {
        throw new Error(msg)
    }
}

const runfiles = new Runfiles(process.env)

describe('runfile resolution', () => {
    it('should properly resolve the files with the module(name)', () => {
        const testFixturePath = runfiles.resolve('e2e_runfiles/test_fixture.md')
        const expectedPath = join(__dirname, 'test_fixture.md')

        assert(
            normalizePath(testFixturePath) == normalizePath(expectedPath),
            `Expected the test fixture to be resolved next to the spec source file: ${testFixturePath} vs ${expectedPath}`
        )
    })

    it('should properly resolve with forward slashes', () => {
        const testFixturePath = runfiles.resolve(
            'e2e_runfiles\\test_fixture.md'
        )
        const expectedPath = join(__dirname, 'test_fixture.md')

        assert(
            normalizePath(testFixturePath) == normalizePath(expectedPath),
            `Expected the test fixture to be resolved next to the spec source file: ${testFixturePath} vs ${expectedPath}`
        )
    })

    it('should properly resolve with the __main__ module alias', () => {
        const testFixturePath = runfiles.resolve('__main__/test_fixture.md')
        const expectedPath = join(__dirname, 'test_fixture.md')

        assert(
            normalizePath(testFixturePath) == normalizePath(expectedPath),
            `Expected the test fixture to be resolved next to the spec source file: ${testFixturePath} vs ${expectedPath}`
        )
    })

    it('should properly resolve with the _main module alias', () => {
        const testFixturePath = runfiles.resolve('_main/test_fixture.md')
        const expectedPath = join(__dirname, 'test_fixture.md')

        assert(
            normalizePath(testFixturePath) == normalizePath(expectedPath),
            `Expected the test fixture to be resolved next to the spec source file: ${testFixturePath} vs ${expectedPath}`
        )
    })

    it('should properly resolve a runfile within a direct module dependency', () => {
        const fsPatchPath = runfiles.resolve(
            'aspect_rules_js/js/private/node-patches/fs.cjs'
        )

        assert(!!fsPatchPath, `Expected to find fs patches`)
        assert(
            fsPatchPath.indexOf('/aspect_rules_js/') == -1,
            `Expected to find fs patches in a resolved bzlmod directory`
        )
    })
})

/**
 * Normalizes the delimiters within the specified path. This is useful for test assertions
 * where paths might be computed using different path delimiters.
 */
function normalizePath(value) {
    return value.replace(/\\/g, '/')
}
