Skip to content

Commit

Permalink
Merge pull request #523 from kalaiyarasiganeshalingam/master
Browse files Browse the repository at this point in the history
Fix mismatch error
  • Loading branch information
kalaiyarasiganeshalingam authored Aug 10, 2023
2 parents e39721d + edbbde4 commit 3a5f2f1
Show file tree
Hide file tree
Showing 19 changed files with 807 additions and 177 deletions.
189 changes: 189 additions & 0 deletions ballerina/tests/from_xml_test.bal
Original file line number Diff line number Diff line change
Expand Up @@ -1109,3 +1109,192 @@ isolated function testFromXmlWithBackSlash1() returns error? {
Book_Store actual = check fromXml(payload);
test:assertEquals(actual, expected, msg = "testToRecordWithNamespaces result incorrect");
}


type BookStore7 record {
string storeName;
int postalCode;
@Name {
value: "isOpen"
}
boolean open;
Address7 address;
Codes7 codes;
@Attribute
string status;
@Attribute
string 'xmlns\:ns0;
};

type Address7 record {
string street;
string city;
string country;
};

type Codes7 record {
int[] item;
};

@test:Config {
groups: ["fromXml"]
}
isolated function testRecordToXml7() returns error? {
xml payload = xml `<BookStore7 status="online" xmlns:ns0="http://sample.com/test">
<storeName>foo</storeName>
<postalCode>94</postalCode>
<isOpen>true</isOpen>
<address>
<street>Galle Road</street>
<city>Colombo</city>
<country>Sri Lanka</country>
</address>
<codes>
<item>4</item>
<item>8</item>
<item>9</item>
</codes>
</BookStore7>
<!-- some comment -->
<?doc document="book.doc"?>`;
BookStore7 expected = {
storeName: "foo",
postalCode: 94,
open: true,
address: {
street: "Galle Road",
city: "Colombo",
country: "Sri Lanka"
},
codes: {
item: [4, 8, 9]
},
'xmlns\:ns0: "http://sample.com/test",
status: "online"
};
BookStore7 actual = check fromXml(payload);
test:assertEquals(actual, expected, msg = "testToRecordWithNamespaces result incorrect");
}

@Name {
value: "BookStore8"
}
type BookStore9 record {
string storeName;
int postalCode;
boolean isOpen;
@Name {
value: "address"
}
Address8 addr;
@Name {
value: "codes"
}
Codes8 code;
@Attribute
string status;
@Attribute
string 'xmlns\:ns0;
};

type Address8 record {
string street;
string city;
string country;
};

type Codes8 record {
int[] item;
};

@test:Config {
groups: ["fromXml"]
}
isolated function testRecordToXml8() returns error? {
xml payload = xml `<BookStore8 status="online" xmlns:ns0="http://sample.com/test">
<storeName>foo</storeName>
<postalCode>94</postalCode>
<isOpen>true</isOpen>
<address>
<street>Galle Road</street>
<city>Colombo</city>
<country>Sri Lanka</country>
</address>
<codes>
<item>4</item>
<item>8</item>
<item>9</item>
</codes>
</BookStore8>
<!-- some comment -->
<?doc document="book.doc"?>`;
BookStore9 expected = {
storeName: "foo",
postalCode: 94,
isOpen: true,
addr: {
street: "Galle Road",
city: "Colombo",
country: "Sri Lanka"
},
code: {
item: [4, 8, 9]
},
'xmlns\:ns0: "http://sample.com/test",
status: "online"
};
BookStore9 actual = check fromXml(payload);
test:assertEquals(actual, expected, msg = "testToRecordWithNamespaces result incorrect");
}

type Appointment record {
string firstName;
string lastName;
string email;
string age;
};

@Name {
value: "appointments"
}
type Appointments record {
Appointment[] appointment;
};

@test:Config {
groups: ["fromXml"]
}
isolated function testFromXmlWithNameAnnotation() returns error? {
Appointments expected = {
"appointment": [
{
"firstName":"John",
"lastName":"Doe",
"email":"[email protected]",
"age":"28"
},
{
"firstName":"John",
"lastName":"Doe",
"email":"[email protected]",
"age":"28"
}
]
};
xml xmlPayload = xml `<appointments>
<appointment>
<firstName>John</firstName>
<lastName>Doe</lastName>
<email>[email protected]</email>
<age>28</age>
</appointment>
<appointment>
<firstName>John</firstName>
<lastName>Doe</lastName>
<email>[email protected]</email>
<age>28</age>
</appointment>
</appointments>`;
Appointments result = check fromXml(xmlPayload);
test:assertEquals(result, expected, msg = "testFromXmlWithNameAnnotation result incorrect");
}
5 changes: 5 additions & 0 deletions changelog.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

### Fixed
[Fix the mismatch error by `fromXml` API while the field has the name annotation](https://github.com/ballerina-platform/ballerina-standard-library/issues/3802)

## [2.4.3] - 2023-05-12

### Fixed
- [Fix the bug from fromXml API when xml elements have different namespaces](https://github.com/ballerina-platform/ballerina-standard-library/issues/4434)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,7 @@ public void testInvalidType5() {
List<Diagnostic> errorDiagnosticsList = diagnosticResult.diagnostics().stream()
.filter(r -> r.diagnosticInfo().severity().equals(DiagnosticSeverity.ERROR))
.collect(Collectors.toList());
Assert.assertEquals(errorDiagnosticsList.size(), 5);
Assert.assertEquals(errorDiagnosticsList.size(), 6);
}

@Test
Expand All @@ -116,7 +116,7 @@ public void testInvalidType6() {
List<Diagnostic> errorDiagnosticsList = diagnosticResult.diagnostics().stream()
.filter(r -> r.diagnosticInfo().severity().equals(DiagnosticSeverity.ERROR))
.collect(Collectors.toList());
Assert.assertEquals(errorDiagnosticsList.size(), 3);
Assert.assertEquals(errorDiagnosticsList.size(), 4);
}

@Test
Expand All @@ -125,7 +125,7 @@ public void testInvalidType7() {
List<Diagnostic> errorDiagnosticsList = diagnosticResult.diagnostics().stream()
.filter(r -> r.diagnosticInfo().severity().equals(DiagnosticSeverity.ERROR))
.collect(Collectors.toList());
Assert.assertEquals(errorDiagnosticsList.size(), 2);
Assert.assertEquals(errorDiagnosticsList.size(), 3);
}

@Test
Expand All @@ -134,7 +134,7 @@ public void testInvalidType8() {
List<Diagnostic> errorDiagnosticsList = diagnosticResult.diagnostics().stream()
.filter(r -> r.diagnosticInfo().severity().equals(DiagnosticSeverity.ERROR))
.collect(Collectors.toList());
Assert.assertEquals(errorDiagnosticsList.size(), 4);
Assert.assertEquals(errorDiagnosticsList.size(), 5);
}

@Test
Expand All @@ -153,9 +153,30 @@ public void testInvalidUnionType1() {
.filter(r -> r.diagnosticInfo().severity().equals(DiagnosticSeverity.ERROR))
.collect(Collectors.toList());
Assert.assertEquals(errorDiagnosticsList.size(), 2);
Assert.assertEquals(errorDiagnosticsList.get(0).diagnosticInfo().messageFormat(),
"invalid field type: the record field does not support the optional value type");
Assert.assertEquals(errorDiagnosticsList.get(1).diagnosticInfo().messageFormat(),
"invalid field type: the record field does not support the optional value type");
Assert.assertEquals(errorDiagnosticsList.get(0).diagnosticInfo().messageFormat(),
"invalid union type: union type does not support multiple non-primitive record types");
}
@Test
public void testInvalidChildAnnotation() {
DiagnosticResult diagnosticResult = loadPackage("sample11").getCompilation().diagnosticResult();
List<Diagnostic> errorDiagnosticsList = diagnosticResult.diagnostics().stream()
.filter(r -> r.diagnosticInfo().severity().equals(DiagnosticSeverity.ERROR))
.collect(Collectors.toList());
Assert.assertEquals(errorDiagnosticsList.size(), 1);
Assert.assertEquals(errorDiagnosticsList.get(0).diagnosticInfo().messageFormat(),
"invalid annotation attachment: child record does not allow name annotation");
}

@Test
public void testInvalidChildAnnotation1() {
DiagnosticResult diagnosticResult = loadPackage("sample12").getCompilation().diagnosticResult();
List<Diagnostic> errorDiagnosticsList = diagnosticResult.diagnostics().stream()
.filter(r -> r.diagnosticInfo().severity().equals(DiagnosticSeverity.ERROR))
.collect(Collectors.toList());
Assert.assertEquals(errorDiagnosticsList.size(), 1);
Assert.assertEquals(errorDiagnosticsList.get(0).diagnosticInfo().messageFormat(),
"invalid annotation attachment: child record does not allow name annotation");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ type Foo record {
};

type Bar record {
int? bar;
int? bar = 2;
string car;
};

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
[package]
org = "xmldata_test"
name = "sample9"
name = "sample10"
version = "0.1.0"
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
[package]
org = "xmldata_test"
name = "sample11"
version = "0.1.0"
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
// Copyright (c) 2023, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
//
// WSO2 LLC. licenses this file to you under the Apache License,
// Version 2.0 (the "License"); you may not use this file except
// in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.

import ballerina/xmldata;

@xmldata:Name {
value: "Foo1"
}
type Foo record {
Bar foo;
};

@xmldata:Name {
value: "Bar1"
}
type Bar record {
int bar;
Bar2 bar2;
};

@xmldata:Name {
value: "Bar4"
}
@xmldata:Namespace {
prefix: "ns",
uri: "http://sdf.com"
}
type Bar2 record {
int bar;
string car;
};

public function main() returns error? {
xml x1 = xml `<foo><bar>2</bar><car></car></foo>`;
Foo actual = check xmldata:fromXml(x1);
Bar result = check xmldata:fromXml(x1);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
[package]
org = "xmldata_test"
name = "sample12"
version = "0.1.0"
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
// Copyright (c) 2023, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
//
// WSO2 LLC. licenses this file to you under the Apache License,
// Version 2.0 (the "License"); you may not use this file except
// in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.

import ballerina/xmldata;
import ballerina/io;

@xmldata:Name {
value: "appointment"
}
type Appointment record {
string firstName;
string lastName;
string email;
string age;
};

@xmldata:Name {
value: "appointments"
}
type Appointments record {
Appointment[] appointment;
};

public function main() returns error? {
xml xmlPayload = xml `<appointments><appointment><firstName>John</firstName><lastName>Doe</lastName><email>[email protected]</email><age>28</age></appointment><appointment><firstName>John</firstName><lastName>Doe</lastName><email>[email protected]</email><age>28</age></appointment></appointments>`;

map<json> result2 = check xmldata:fromXml(xmlPayload);
io:println(result2);

// Sample
Appointments result3 = check xmldata:fromXml(xmlPayload);
io:println(result3);
}
Loading

0 comments on commit 3a5f2f1

Please sign in to comment.