id-124 1234 true 3.14 '; $xml = new BaiscTypeXml(); Deserializer::deserializeXml($str, $xml); $this->assertTrue(\is_scalar($xml->strValue)); $this->assertEquals('id-124', $xml->strValue); $this->assertEquals(1234, $xml->intValue); $this->assertEquals(true, $xml->boolValue); $this->assertEquals(3.14, $xml->floatValue); $str = ' '; $xml = new BaiscTypeXml(); Deserializer::deserializeXml($str, $xml); $this->assertFalse(isset($xml->StrValue)); $this->assertFalse(isset($xml->IntValue)); $this->assertFalse(isset($xml->BoolValue)); $this->assertFalse(isset($xml->FloatValue)); $str = ' 1234 true '; $xml = new BaiscTypeXml(); Deserializer::deserializeXml($str, $xml); $this->assertFalse(isset($xml->StrValue)); $this->assertEquals(1234, $xml->intValue); $this->assertEquals(true, $xml->boolValue); $this->assertFalse(isset($xml->FloatValue)); } public function testDeserializeBaiscTypeListXml(): void { $str = ' str1 str2 1234 2234 true true false 3.14 '; $xml = new BaiscTypeListXml(); Deserializer::deserializeXml($str, $xml); $this->assertEquals(2, count($xml->strValues)); $this->assertEquals('str1', $xml->strValues[0]); $this->assertEquals('str2', $xml->strValues[1]); $this->assertEquals(2, count($xml->intValues)); $this->assertEquals(1234, $xml->intValues[0]); $this->assertEquals(2234, $xml->intValues[1]); $this->assertEquals(3, count($xml->boolValues)); $this->assertEquals(true, $xml->boolValues[0]); $this->assertEquals(true, $xml->boolValues[1]); $this->assertEquals(false, $xml->boolValues[2]); $this->assertTrue(\is_array($xml->floatValues)); $this->assertEquals(1, count($xml->floatValues)); $this->assertEquals('3.14', $xml->floatValues[0]); $str = ' '; $xml = new BaiscTypeListXml(); Deserializer::deserializeXml($str, $xml); $this->assertFalse(isset($xml->strValues)); $this->assertFalse(isset($xml->intValues)); $this->assertFalse(isset($xml->boolValues)); $this->assertFalse(isset($xml->floatValues)); } public function testDeserializeDateTimeTypeXml() { $date = new \DateTime(); $date->setTimestamp(1702783809); $date1 = new \DateTimeImmutable(); $date1 = $date1->setTimestamp(1702783819); $str = ' 2023-12-17T03:30:09Z 1702783809 Sun, 17 Dec 2023 03:30:09 GMT '; $xml = new DatetimeTypeXml(); Deserializer::deserializeXml($str, $xml); $this->assertEquals($date, $xml->isotimeValue); $this->assertFalse(isset($xml->dateTimeImmutableValue)); $this->assertEquals($date, $xml->unixtimeValue); $this->assertEquals($date, $xml->httptimeValue); } public function testDeserializeMixedTypeXml(): void { $str = ' str-111 12 str 123 true 1.14 str1 str2 1234 2234 true true false 3.14 '; $xml = new MixedTypeXml(); Deserializer::deserializeXml($str, $xml); $this->assertEquals('str-111', $xml->strValue); $this->assertEquals(12, $xml->intValue); $this->assertEquals('str', $xml->xmlValue->strValue); $this->assertEquals(123, $xml->xmlValue->intValue); $this->assertEquals(true, $xml->xmlValue->boolValue); $this->assertEquals(1.14, $xml->xmlValue->floatValue); $this->assertEquals(2, count($xml->xmlListValue->strValues)); $this->assertEquals('str1', $xml->xmlListValue->strValues[0]); $this->assertEquals('str2', $xml->xmlListValue->strValues[1]); $this->assertEquals(2, count($xml->xmlListValue->intValues)); $this->assertEquals(1234, $xml->xmlListValue->intValues[0]); $this->assertEquals(2234, $xml->xmlListValue->intValues[1]); $this->assertEquals(3, count($xml->xmlListValue->boolValues)); $this->assertEquals(true, $xml->xmlListValue->boolValues[0]); $this->assertEquals(true, $xml->xmlListValue->boolValues[1]); $this->assertEquals(false, $xml->xmlListValue->boolValues[2]); $this->assertEquals(1, count($xml->xmlListValue->floatValues)); $this->assertEquals('3.14', $xml->xmlListValue->floatValues[0]); } public function testDeserializeMixedTypeListXml(): void { $str = ' str-111 12 str 123 true 1.14 str-1 223 false '; $xml = new MixedTypeListXml(); Deserializer::deserializeXml($str, $xml); $this->assertEquals('str-111', $xml->strValue); $this->assertEquals(12, $xml->intValue); $this->assertTrue(\is_array($xml->xmlValues)); $this->assertEquals(2, count($xml->xmlValues)); $this->assertEquals('str', $xml->xmlValues[0]->strValue); $this->assertEquals(123, $xml->xmlValues[0]->intValue); $this->assertEquals(true, $xml->xmlValues[0]->boolValue); $this->assertEquals(1.14, $xml->xmlValues[0]->floatValue); $this->assertEquals('str-1', $xml->xmlValues[1]->strValue); $this->assertEquals(223, $xml->xmlValues[1]->intValue); $this->assertEquals(false, $xml->xmlValues[1]->boolValue); $this->assertFalse(isset($xml->xmlValues[1]->floatValue)); $str = ' str-111 12 str 123 true 1.14 '; $xml = new MixedTypeListXml(); Deserializer::deserializeXml($str, $xml); $this->assertEquals('str-111', $xml->strValue); $this->assertEquals(12, $xml->intValue); $this->assertTrue(\is_array($xml->xmlValues)); $this->assertEquals(1, count($xml->xmlValues)); $this->assertEquals('str', $xml->xmlValues[0]->strValue); $this->assertEquals(123, $xml->xmlValues[0]->intValue); $this->assertEquals(true, $xml->xmlValues[0]->boolValue); $this->assertEquals(1.14, $xml->xmlValues[0]->floatValue); } public function testDeserializeCheckXmlRoot(): void { $str = ' str-111 12 str 123 true 1.14 str-1 223 false '; $xml = new MixedTypeListXml(); try { Deserializer::deserializeXml($str, $xml, 'MixedTypeList'); $this->assertTrue(false, "shoud not here"); } catch (DeserializationExecption $e) { $this->assertStringContainsString("Deserialization raised an exception: Not found tag ", (string)$e); } catch (\Exception $e) { $this->assertTrue(false, "shoud not here"); } } public function testDeserializeInvalidXml(): void { $str = 'invalid xml'; $xml = new MixedTypeListXml(); try { Deserializer::deserializeXml($str, $xml, 'MixedTypeList'); $this->assertTrue(false, "shoud not here"); } catch (DeserializationExecption $e) { $this->assertStringContainsString("Deserialization raised an exception: Error parsing XML: part data ", (string)$e); } catch (\Exception $e) { $this->assertTrue(false, "shoud not here"); } } public function testDeserializeOutputCommon(): void { $output = new OperationOutput(); $result = new PutApiResult(); Deserializer::deserializeOutput($result, $output); $this->assertEquals('', $result->getStatus()); $this->assertEquals(0, $result->getStatusCode()); $this->assertEquals('', $result->getRequestId()); $this->assertEquals(0, count($result->getHeaders())); $output = new OperationOutput( status: 'OK', statusCode: 200, headers: ['x-oss-request-id' => '123', 'content-type' => 'test'] ); $result = new PutApiResult(); Deserializer::deserializeOutput($result, $output); $this->assertEquals('OK', $result->getStatus()); $this->assertEquals(200, $result->getStatusCode()); $this->assertEquals('123', $result->getRequestId()); $this->assertEquals(2, count($result->getHeaders())); $this->assertEquals('test', $result->getHeaders()['content-type']); $this->assertEquals('123', $result->getHeaders()['x-oss-request-id']); $output = new OperationOutput( status: 'OK', statusCode: 203, headers: ['content-type' => 'test'] ); $result = new PutApiResult(); Deserializer::deserializeOutput($result, $output); $this->assertEquals('OK', $result->getStatus()); $this->assertEquals(203, $result->getStatusCode()); $this->assertEquals('', $result->getRequestId()); $this->assertEquals(1, count($result->getHeaders())); $this->assertEquals('test', $result->getHeaders()['content-type']); } public function testDeserializeOutputHeaderTag(): void { // normal header $output = new OperationOutput( status: 'OK', statusCode: 200, headers: [ 'x-oss-request-id' => '123', 'content-type' => 'test', 'x-oss-str' => 'str-1', 'x-oss-int' => '123', 'x-oss-bool' => 'false', 'x-oss-float' => '3.5', 'x-oss-isotime' => '2023-12-17T03:30:09Z', 'x-oss-httptime' => 'Sun, 17 Dec 2023 03:30:09 GMT', 'x-oss-unixtime' => '1702783809', ], ); $date = new \DateTime(); $date->setTimestamp(1702783809); $result = new PutApiResult(); $customDeserializer = [ [Deserializer::class, 'deserializeOutputHeaders'], ]; Deserializer::deserializeOutput($result, $output, $customDeserializer); $this->assertEquals('OK', $result->getStatus()); $this->assertEquals(200, $result->getStatusCode()); $this->assertEquals('123', $result->getRequestId()); $this->assertEquals(9, count($result->getHeaders())); $this->assertEquals('str-1', $result->getStrHeader()); $this->assertEquals(123, $result->getIntHeader()); $this->assertEquals(false, $result->getBoolHeader()); $this->assertEquals(3.5, $result->getFloatHeader()); $this->assertEquals($date, $result->getIsotimeHeader()); $this->assertEquals($date, $result->getHttptimeHeader()); $this->assertEquals($date, $result->getUnixtimeHeader()); // header array // normal header $output = new OperationOutput( status: 'OK', statusCode: 200, headers: [ 'x-oss-request-id' => '123', 'x-oss-str' => 'str-1', 'x-oss-int' => '123', 'x-oss-prefix-str1' => '123-1', 'x-oss-prefix-str2' => '123-2', 'x-oss-prefix-str3' => '123-3', ], ); $date = new \DateTime(); $date->setTimestamp(1702783809); $result = new PutApiResult(); $customDeserializer = [ [Deserializer::class, 'deserializeOutputHeaders'], ]; Deserializer::deserializeOutput($result, $output, $customDeserializer); $this->assertEquals('OK', $result->getStatus()); $this->assertEquals(200, $result->getStatusCode()); $this->assertEquals('123', $result->getRequestId()); $this->assertEquals(6, count($result->getHeaders())); $this->assertEquals('str-1', $result->getStrHeader()); $this->assertEquals(123, $result->getIntHeader()); $this->assertEquals(null, $result->getBoolHeader()); $this->assertEquals(null, $result->getFloatHeader()); $this->assertEquals(null, $result->getIsotimeHeader()); $this->assertEquals(null, $result->getHttptimeHeader()); $this->assertEquals(null, $result->getUnixtimeHeader()); $this->assertEquals(3, count($result->getArrayHeader())); $this->assertEquals('123-1', $result->getArrayHeader()['str1']); $this->assertEquals('123-2', $result->getArrayHeader()['str2']); $this->assertEquals('123-3', $result->getArrayHeader()['str3']); } public function testDeserializeOutputBodyXml(): void { // null body $output = new OperationOutput( status: 'OK', statusCode: 200, headers: [ 'x-oss-request-id' => '123', 'content-type' => 'test', ], ); $result = new PutApiResult(); $customDeserializer = [ [Deserializer::class, 'deserializeOutputBody'], ]; Deserializer::deserializeOutput($result, $output, $customDeserializer); $this->assertEquals('OK', $result->getStatus()); $this->assertEquals(200, $result->getStatusCode()); $this->assertEquals('123', $result->getRequestId()); $this->assertEquals(2, count($result->getHeaders())); $this->assertEquals(null, $result->getConfiguration()); //empty body $output = new OperationOutput( status: 'OK', statusCode: 200, headers: [ 'x-oss-request-id' => '123', 'content-type' => 'test', ], body: Utils::streamFor(''), ); $result = new PutApiResult(); $customDeserializer = [ [Deserializer::class, 'deserializeOutputBody'], ]; Deserializer::deserializeOutput($result, $output, $customDeserializer); $this->assertEquals('OK', $result->getStatus()); $this->assertEquals(200, $result->getStatusCode()); $this->assertEquals('123', $result->getRequestId()); $this->assertEquals(2, count($result->getHeaders())); $this->assertEquals(null, $result->getConfiguration()); //xml $str = ' str1 str2 str-sub 1234 '; $output = new OperationOutput( status: 'OK', statusCode: 200, headers: [ 'x-oss-request-id' => '123', 'content-type' => 'test', ], body: Utils::streamFor($str), ); $result = new PutApiResult(); $customDeserializer = [ [Deserializer::class, 'deserializeOutputBody'], ]; Deserializer::deserializeOutput($result, $output, $customDeserializer); $this->assertEquals('OK', $result->getStatus()); $this->assertEquals(200, $result->getStatusCode()); $this->assertEquals('123', $result->getRequestId()); $this->assertEquals(2, count($result->getHeaders())); $this->assertInstanceOf(RootConfiguration::class, $result->getConfiguration()); $this->assertEquals('str1', $result->getConfiguration()->getId()); $this->assertEquals('str2', $result->getConfiguration()->getText()); $this->assertEquals('str-sub', $result->getConfiguration()->getSubConfiguration()[0]->getStrField()); $this->assertEquals(1234, $result->getConfiguration()->getSubConfiguration()[0]->getIntField()); //xml tag not match $str = ' str1 str2 str-sub 1234 '; $output = new OperationOutput( status: 'OK', statusCode: 200, headers: [ 'x-oss-request-id' => '123', 'content-type' => 'test', ], body: Utils::streamFor($str), ); $result = new PutApiResult(); $customDeserializer = [ [Deserializer::class, 'deserializeOutputBody'], ]; try { Deserializer::deserializeOutput($result, $output, $customDeserializer); $this->assertTrue(false, "shoud not here"); } catch (DeserializationExecption $e) { $this->assertStringContainsString("Deserialization raised an exception: Not found tag ", (string)$e); } catch (\Exception $e) { $this->assertTrue(false, "shoud not here"); } } public function testDeserializeOutputHeaderBodyTag(): void { //xml $str = ' str1 str2 str-sub 1234 '; $date = new \DateTime(); $date->setTimestamp(1702783809); $output = new OperationOutput( status: 'OK', statusCode: 200, headers: [ 'x-oss-request-id' => '123', 'content-type' => 'test', 'x-oss-str' => 'str-1', 'x-oss-int' => '123', 'x-oss-bool' => 'false', 'x-oss-float' => '3.5', 'x-oss-isotime' => '2023-12-17T03:30:09Z', 'x-oss-httptime' => 'Sun, 17 Dec 2023 03:30:09 GMT', 'x-oss-unixtime' => '1702783809', ], body: Utils::streamFor($str), ); $result = new PutApiResult(); $customDeserializer = [ [Deserializer::class, 'deserializeOutputHeaders'], [Deserializer::class, 'deserializeOutputBody'], ]; Deserializer::deserializeOutput($result, $output, $customDeserializer); $this->assertEquals('OK', $result->getStatus()); $this->assertEquals(200, $result->getStatusCode()); $this->assertEquals('123', $result->getRequestId()); $this->assertEquals(9, count($result->getHeaders())); $this->assertEquals('str-1', $result->getStrHeader()); $this->assertEquals(123, $result->getIntHeader()); $this->assertEquals(false, $result->getBoolHeader()); $this->assertEquals(3.5, $result->getFloatHeader()); $this->assertEquals($date, $result->getIsotimeHeader()); $this->assertEquals($date, $result->getHttptimeHeader()); $this->assertEquals($date, $result->getUnixtimeHeader()); $this->assertInstanceOf(RootConfiguration::class, $result->getConfiguration()); $this->assertEquals('str1', $result->getConfiguration()->getId()); $this->assertEquals('str2', $result->getConfiguration()->getText()); $this->assertEquals('str-sub', $result->getConfiguration()->getSubConfiguration()[0]->getStrField()); $this->assertEquals(1234, $result->getConfiguration()->getSubConfiguration()[0]->getIntField()); } public function testDeserializeOutputBodyXmlElement(): void { //xml $str = ' str1 str2 str-sub 1234 '; $date = new \DateTime(); $date->setTimestamp(1702783809); $output = new OperationOutput( status: 'OK', statusCode: 200, headers: [ 'x-oss-request-id' => '123', 'content-type' => 'test', 'x-oss-str' => 'str-1', 'x-oss-int' => '123', 'x-oss-bool' => 'false', 'x-oss-float' => '3.5', ], body: Utils::streamFor($str), ); $result = new PutApiBResult(); $customDeserializer = [ [Deserializer::class, 'deserializeOutputHeaders'], [Deserializer::class, 'deserializeOutputInnerBody'], ]; Deserializer::deserializeOutput($result, $output, $customDeserializer); $this->assertEquals('OK', $result->getStatus()); $this->assertEquals(200, $result->getStatusCode()); $this->assertEquals('123', $result->getRequestId()); $this->assertEquals(6, count($result->getHeaders())); $this->assertEquals('str-1', $result->getStrHeader()); $this->assertEquals(123, $result->getIntHeader()); $this->assertEquals(false, $result->getBoolHeader()); $this->assertEquals(3.5, $result->getFloatHeader()); $this->assertEquals('str1', $result->getId()); $this->assertEquals('str2', $result->getText()); $this->assertEquals('str-sub', $result->getSubConfiguration()[0]->getStrField()); $this->assertEquals(1234, $result->getSubConfiguration()[0]->getIntField()); } }