import * as fs from 'fs';
import * as path from 'path';
import assert from 'assert';
import { svelte, exists } from '../helpers.js';
import { SourceMapConsumer } from 'source-map';
import { getLocator } from 'locate-character';

describe( 'sourcemaps', () => {
	fs.readdirSync( 'test/sourcemaps/samples' ).forEach( dir => {
		if ( dir[0] === '.' ) return;

		const solo = exists( `test/sourcemaps/samples/${dir}/solo` );

		if ( solo && process.env.CI ) {
			throw new Error( 'Forgot to remove `solo: true` from test' );
		}

		( solo ? it.only : it )( dir, () => {
			const filename = path.resolve( `test/sourcemaps/samples/${dir}/input.html` );
			const outputFilename = path.resolve( `test/sourcemaps/samples/${dir}/output.js` );

			const input = fs.readFileSync( filename, 'utf-8' ).replace( /\s+$/, '' );
			const { code, map } = svelte.compile( input, {
				filename,
				outputFilename
			});

			fs.writeFileSync( outputFilename, `${code}\n//# sourceMappingURL=output.js.map` );
			fs.writeFileSync( `${outputFilename}.map`, JSON.stringify( map, null, '  ' ) );

			assert.deepEqual( map.sources, [ 'input.html' ]);

			const { test } = require( `./samples/${dir}/test.js` );

			const smc = new SourceMapConsumer( map );

			const locateInSource = getLocator( input );
			const locateInGenerated = getLocator( code );

			test({ assert, code, map, smc, locateInSource, locateInGenerated });
		});
	});
});