public function convert(BaseQuestionType $question, $interactionIdentifier, $interactionLabel)
 {
     /** @var choicematrix $question */
     // Is multiple response ?
     $isMultipleResponses = !empty($question->get_multiple_responses()) ? $question->get_multiple_responses() : false;
     $optionCount = count($question->get_options());
     $stemCount = count($question->get_stems());
     // Append the two sets of choices, the first set defines the source choices and the second set the targets
     $simpleMatchCollection = new SimpleMatchSetCollection();
     list($stemCollection, $stemIndexIdentifierMap) = $this->buildStemCollection($question, $isMultipleResponses, $optionCount);
     list($optionCollection, $optionIndexIdentifierMap) = $this->buildOptionCollection($question, $stemCount);
     $simpleMatchCollection->attach(new SimpleMatchSet($stemCollection));
     $simpleMatchCollection->attach(new SimpleMatchSet($optionCollection));
     // Build the interaction
     $interaction = new MatchInteraction($interactionIdentifier, $simpleMatchCollection);
     $interaction->setPrompt($this->convertStimulusForPrompt($question->get_stimulus()));
     $interaction->setLabel($interactionLabel);
     $interaction->setShuffle(false);
     // No support for shuffling
     // If multiple response set then student is allowed to put 1 association (tick 1 box) or (optionCount * stemCount) association (tick all the boxes)
     $interaction->setMaxAssociations($isMultipleResponses ? $optionCount * $stemCount : $stemCount);
     $interaction->setMinAssociations($isMultipleResponses ? 1 : $stemCount);
     $builder = new ChoicematrixValidationBuilder($stemIndexIdentifierMap, $optionIndexIdentifierMap);
     list($responseDeclaration, $responseProcessing) = $builder->buildValidation($interactionIdentifier, $question->get_validation());
     return [$interaction, $responseDeclaration, $responseProcessing];
 }
 public static function buildMatchInteraction($identifier, array $matchSets, $isMultipleResponses = false)
 {
     assert(count($matchSets) === 2);
     $simpleMatchSetCollection = new SimpleMatchSetCollection();
     // Build source choices (`stems`)
     $simpleMatchSetCollection->attach(self::buildSimpleMatchSet($matchSets[0], 1));
     // Build target choices (`options`)
     $targetMatchMax = $isMultipleResponses ? count($matchSets[1]) : 1;
     $simpleMatchSetCollection->attach(self::buildSimpleMatchSet($matchSets[1], $targetMatchMax));
     return new MatchInteraction($identifier, $simpleMatchSetCollection);
 }