import 'mocha';
import { expect } from 'chai';

export function testParameterName(action: (parameterName: string) => string) {
    describe('name', () => {
        describe('sets as expected', () => {
            // arrange
            const expectedValues = [
                'lowercase',
                'onlyLetters',
                'l3tt3rsW1thNumb3rs',
            ];
            for (const expected of expectedValues) {
                it(expected, () => {
                    // act
                    const value = action(expected);
                    // assert
                    expect(value).to.equal(expected);
                });
            }
        });
        describe('throws if invalid', () => {
            // arrange
            const testCases = [
                {
                    name: 'undefined',
                    value: undefined,
                    expectedError: 'undefined parameter name',
                },
                {
                    name: 'empty',
                    value: '',
                    expectedError: 'undefined parameter name',
                },
                {
                    name: 'has @',
                    value: 'b@d',
                    expectedError: 'parameter name must be alphanumeric but it was "b@d"',
                },
                {
                    name: 'has {',
                    value: 'b{a}d',
                    expectedError: 'parameter name must be alphanumeric but it was "b{a}d"',
                },
            ];
            for (const testCase of testCases) {
                it(testCase.name, () => {
                    // act
                    const act = () => action(testCase.value);
                    // assert
                    expect(act).to.throw(testCase.expectedError);
                });
            }
        });
    });
}
