/**
  * @dataProvider writeVariableValueProvider
  * 
  * @param Variable $variable
  */
 public function testWriteVariableValue(Variable $variable)
 {
     $stream = new MemoryStream();
     $stream->open();
     $access = new QtiBinaryStreamAccessFsFile($stream);
     // Write the variable value.
     $access->writeVariableValue($variable);
     $stream->rewind();
     $testVariable = clone $variable;
     // Reset the value of $testVariable.
     $testVariable->setValue(null);
     // Read what we just wrote.
     $access->readVariableValue($testVariable);
     $originalValue = $variable->getValue();
     $readValue = $testVariable->getValue();
     // Compare.
     if (is_null($originalValue) === true) {
         $this->assertSame($originalValue, $readValue);
     } else {
         if (is_scalar($originalValue) === true) {
             $this->assertEquals($originalValue, $readValue);
         } else {
             if ($originalValue instanceof RecordContainer) {
                 $this->assertEquals($originalValue->getCardinality(), $readValue->getCardinality());
                 $this->assertTrue($readValue->equals($originalValue));
             } else {
                 if ($originalValue instanceof Container) {
                     // MULTIPLE or ORDERED container.
                     $this->assertEquals($originalValue->getCardinality(), $readValue->getCardinality());
                     $this->assertEquals($readValue->getBaseType(), $readValue->getBaseType());
                     $this->assertTrue($readValue->equals($originalValue), $originalValue . " != " . $readValue);
                 } else {
                     if ($originalValue instanceof Comparable) {
                         // Complex QTI Runtime object.
                         $this->assertTrue($readValue->equals($originalValue));
                     } else {
                         // Unknown datatype.
                         $this->assertTrue(false);
                     }
                 }
             }
         }
     }
 }
 /**
  * @dataProvider writeVariableValueProvider
  * 
  * @param Variable $variable
  */
 public function testWriteVariableValue(Variable $variable, $valueType = QtiBinaryStreamAccessFsFile::RW_VALUE)
 {
     $stream = new MemoryStream();
     $stream->open();
     $access = new QtiBinaryStreamAccessFsFile($stream);
     switch ($valueType) {
         case QtiBinaryStreamAccessFsFile::RW_DEFAULTVALUE:
             $setterToCall = 'setDefaultValue';
             $getterToCall = 'getDefaultValue';
             break;
         case QtiBinaryStreamAccessFsFile::RW_CORRECTRESPONSE:
             $setterToCall = 'setCorrectResponse';
             $getterToCall = 'getCorrectResponse';
             break;
         default:
             $setterToCall = 'setValue';
             $getterToCall = 'getValue';
             break;
     }
     // Write the variable value.
     $access->writeVariableValue($variable, $valueType);
     $stream->rewind();
     $testVariable = clone $variable;
     // Reset the value of $testVariable.
     call_user_func(array($testVariable, $setterToCall), null);
     // Read what we just wrote.
     $access->readVariableValue($testVariable, $valueType);
     $originalValue = call_user_func(array($variable, $getterToCall));
     $readValue = call_user_func(array($testVariable, $getterToCall));
     // Compare.
     if (is_null($originalValue) === true) {
         $this->assertSame($originalValue, $readValue);
     } else {
         if (is_scalar($originalValue) === true) {
             $this->assertEquals($originalValue, $readValue);
         } else {
             if ($originalValue instanceof RecordContainer) {
                 $this->assertEquals($originalValue->getCardinality(), $readValue->getCardinality());
                 $this->assertTrue($readValue->equals($originalValue));
             } else {
                 if ($originalValue instanceof Container) {
                     // MULTIPLE or ORDERED container.
                     $this->assertEquals($originalValue->getCardinality(), $readValue->getCardinality());
                     $this->assertEquals($readValue->getBaseType(), $readValue->getBaseType());
                     $this->assertTrue($readValue->equals($originalValue), $originalValue . " != " . $readValue);
                 } else {
                     if ($originalValue instanceof Comparable) {
                         // Complex QTI Runtime object.
                         $this->assertTrue($readValue->equals($originalValue));
                     } else {
                         // Unknown datatype.
                         $this->assertTrue(false);
                     }
                 }
             }
         }
     }
 }