import { OLXParser } from './OLXParser';
import {
  checkboxesOLXWithFeedbackAndHintsOLX,
  dropdownOLXWithFeedbackAndHintsOLX,
  numericInputWithFeedbackAndHintsOLX,
  numericInputWithFeedbackAndHintsOLXException,
  textInputWithFeedbackAndHintsOLX,
  mutlipleChoiceWithFeedbackAndHintsOLX,
  textInputWithFeedbackAndHintsOLXWithMultipleAnswers,
  advancedProblemOlX,
  multipleProblemOlX,
  blankProblemOLX,
  blankQuestionOLX,
} from './mockData/olxTestData';
import { ProblemTypeKeys } from '../../../data/constants/problem';

describe('Check OLXParser problem type', () => {
  test('Test checkbox with feedback and hints problem type', () => {
    const olxparser = new OLXParser(checkboxesOLXWithFeedbackAndHintsOLX.rawOLX);
    const problemType = olxparser.getProblemType();
    expect(problemType).toBe(ProblemTypeKeys.MULTISELECT);
  });
  test('Test numeric problem type', () => {
    const olxparser = new OLXParser(numericInputWithFeedbackAndHintsOLX.rawOLX);
    const problemType = olxparser.getProblemType();
    expect(problemType).toBe(ProblemTypeKeys.NUMERIC);
  });
  test('Test dropdown with feedback and hints problem type', () => {
    const olxparser = new OLXParser(dropdownOLXWithFeedbackAndHintsOLX.rawOLX);
    const problemType = olxparser.getProblemType();
    expect(problemType).toBe(ProblemTypeKeys.DROPDOWN);
  });
  test('Test multiple choice with feedback and hints problem type', () => {
    const olxparser = new OLXParser(mutlipleChoiceWithFeedbackAndHintsOLX.rawOLX);
    const problemType = olxparser.getProblemType();
    expect(problemType).toBe(ProblemTypeKeys.SINGLESELECT);
  });
  test('Test textual problem type', () => {
    const olxparser = new OLXParser(textInputWithFeedbackAndHintsOLX.rawOLX);
    const problemType = olxparser.getProblemType();
    expect(problemType).toBe(ProblemTypeKeys.TEXTINPUT);
  });
  test('Test Advanced Problem Type', () => {
    const olxparser = new OLXParser(advancedProblemOlX.rawOLX);
    const problemType = olxparser.getProblemType();
    expect(problemType).toBe(ProblemTypeKeys.ADVANCED);
  });
  test('Test Advanced Problem Type by multiples', () => {
    const olxparser = new OLXParser(multipleProblemOlX.rawOLX);
    const problemType = olxparser.getProblemType();
    expect(problemType).toBe(ProblemTypeKeys.ADVANCED);
  });
  test('Test Blank Problem Type', () => {
    const olxparser = new OLXParser(blankProblemOLX.rawOLX);
    const problemType = olxparser.getProblemType();
    expect(problemType).toBe(null);
  });
});

describe('Check OLXParser hints', () => {
  test('Test checkbox hints', () => {
    const olxparser = new OLXParser(checkboxesOLXWithFeedbackAndHintsOLX.rawOLX);
    const hints = olxparser.getHints();
    expect(hints).toEqual(checkboxesOLXWithFeedbackAndHintsOLX.hints);
  });
  test('Test numeric hints', () => {
    const olxparser = new OLXParser(numericInputWithFeedbackAndHintsOLX.rawOLX);
    const hints = olxparser.getHints();
    expect(hints).toEqual(numericInputWithFeedbackAndHintsOLX.hints);
  });
  test('Test dropdown with feedback and hints problem type', () => {
    const olxparser = new OLXParser(dropdownOLXWithFeedbackAndHintsOLX.rawOLX);
    const hints = olxparser.getHints();
    expect(hints).toEqual(dropdownOLXWithFeedbackAndHintsOLX.hints);
  });
  test('Test multiple choice with feedback and hints problem type', () => {
    const olxparser = new OLXParser(mutlipleChoiceWithFeedbackAndHintsOLX.rawOLX);
    const hints = olxparser.getHints();
    expect(hints).toEqual(mutlipleChoiceWithFeedbackAndHintsOLX.hints);
  });
  test('Test textual problem type', () => {
    const olxparser = new OLXParser(textInputWithFeedbackAndHintsOLX.rawOLX);
    const hints = olxparser.getHints();
    expect(hints).toEqual(textInputWithFeedbackAndHintsOLX.hints);
  });
});

describe('Check OLXParser for answer parsing', () => {
  test('Test checkbox answer', () => {
    const olxparser = new OLXParser(checkboxesOLXWithFeedbackAndHintsOLX.rawOLX);
    const answer = olxparser.parseMultipleChoiceAnswers('choiceresponse', 'checkboxgroup', 'choice');
    expect(answer).toEqual(checkboxesOLXWithFeedbackAndHintsOLX.data);
  });
  test('Test dropdown answer', () => {
    const olxparser = new OLXParser(dropdownOLXWithFeedbackAndHintsOLX.rawOLX);
    const answer = olxparser.parseMultipleChoiceAnswers('optionresponse', 'optioninput', 'option');
    expect(answer).toEqual(dropdownOLXWithFeedbackAndHintsOLX.data);
  });
  test('Test multiple choice single select', () => {
    const olxparser = new OLXParser(mutlipleChoiceWithFeedbackAndHintsOLX.rawOLX);
    const answer = olxparser.parseMultipleChoiceAnswers('multiplechoiceresponse', 'choicegroup', 'choice');
    expect(answer).toEqual(mutlipleChoiceWithFeedbackAndHintsOLX.data);
  });
  test('Test string response answers', () => {
    const olxparser = new OLXParser(textInputWithFeedbackAndHintsOLX.rawOLX);
    const answer = olxparser.parseStringResponse();
    expect(answer).toEqual(textInputWithFeedbackAndHintsOLX.data);
  });
  test('Test string response answers with multiple answers', () => {
    const olxparser = new OLXParser(textInputWithFeedbackAndHintsOLXWithMultipleAnswers.rawOLX);
    const answer = olxparser.parseStringResponse();
    expect(answer).toEqual(textInputWithFeedbackAndHintsOLXWithMultipleAnswers.data);
  });
  test('Test numerical response answers', () => {
    const olxparser = new OLXParser(numericInputWithFeedbackAndHintsOLX.rawOLX);
    const answer = olxparser.parseNumericResponse();
    expect(answer).toEqual(numericInputWithFeedbackAndHintsOLX.data);
  });
  test('Test numerical response answers exception', () => {
    const olxparser = new OLXParser(numericInputWithFeedbackAndHintsOLXException.rawOLX);
    const answer = olxparser.parseNumericResponse();
    expect(answer).toEqual(numericInputWithFeedbackAndHintsOLXException.data);
  });
});

describe('Check OLXParser for question parsing', () => {
  test('Test checkbox question', () => {
    const olxparser = new OLXParser(checkboxesOLXWithFeedbackAndHintsOLX.rawOLX);
    const question = olxparser.parseQuestions('choiceresponse');
    expect(question).toEqual(checkboxesOLXWithFeedbackAndHintsOLX.question);
  });
  test('Test dropdown question', () => {
    const olxparser = new OLXParser(dropdownOLXWithFeedbackAndHintsOLX.rawOLX);
    const question = olxparser.parseQuestions('optionresponse');
    expect(question).toEqual(dropdownOLXWithFeedbackAndHintsOLX.question);
  });
  test('Test multiple choice single select question', () => {
    const olxparser = new OLXParser(mutlipleChoiceWithFeedbackAndHintsOLX.rawOLX);
    const question = olxparser.parseQuestions('multiplechoiceresponse');
    expect(question).toEqual(mutlipleChoiceWithFeedbackAndHintsOLX.question);
  });
  test('Test string response question', () => {
    const olxparser = new OLXParser(textInputWithFeedbackAndHintsOLX.rawOLX);
    const question = olxparser.parseQuestions('stringresponse');
    expect(question).toEqual(textInputWithFeedbackAndHintsOLX.question);
  });
  test('Test numerical response question', () => {
    const olxparser = new OLXParser(numericInputWithFeedbackAndHintsOLX.rawOLX);
    const question = olxparser.parseQuestions('numericalresponse');
    expect(question).toEqual(numericInputWithFeedbackAndHintsOLX.question);
  });
  test('Test numerical response question exception', () => {
    const olxparser = new OLXParser(numericInputWithFeedbackAndHintsOLXException.rawOLX);
    const question = olxparser.parseQuestions('numericalresponse');
    expect(question).toEqual(numericInputWithFeedbackAndHintsOLXException.question);
  });
  test('Test OLX with no question content should have empty string for question', () => {
    const olxparser = new OLXParser(blankQuestionOLX.rawOLX);
    const problemType = olxparser.getProblemType();
    const question = olxparser.parseQuestions(problemType);
    expect(question).toBe(blankQuestionOLX.question);
  });
});
