Skip to content

Commit

Permalink
Merge pull request #25 from SasinduDilshara/development-revamp
Browse files Browse the repository at this point in the history
Add compiler errors for ignored parameters
  • Loading branch information
SasinduDilshara authored Aug 13, 2024
2 parents 0d98571 + b02b9fb commit 95720c0
Show file tree
Hide file tree
Showing 14 changed files with 564 additions and 27 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,14 @@ public class CompilerPluginTest {
"are supported for fields, and other types are not allowed.";
static final String UNSUPPORTED_TUPLE_MEMBER_TYPE = "Unsupported type in the tuple member: " +
"Tuple members can only be basic types, other types are not supported.";
static final String IGNORE_OUTPUT_HEADERS_FOR_RECORD_ARRAY = "The option 'outputWithHeaders' will be ignored" +
" since the expected type is a subtype record array.";
static final String IGNORE_HEADERS_ORDER_FOR_RECORD_ARRAY = "The option 'headersOrder' will be ignored" +
" since the expected type is a subtype record array.";
static final String IGNORE_CUSTOM_HEADERS_PARAMETER_WHEN_HEADER_PRESENT = "The option " +
"'customHeadersIfHeadersAbsent' will be ignored since the header is present.";
static final String CUSTOM_HEADERS_SHOULD_BE_PROVIDED = "customHeaders parameter should be provided since the" +
" headerRows larger than 1.";

@Test
public void testInvalidExpectedUnionType() {
Expand Down Expand Up @@ -148,4 +156,114 @@ public void testInvalidExpectedUnionType2() {
Assert.assertEquals(errorDiagnosticsList.get(8).diagnosticInfo().messageFormat(), UNSUPPORTED_TYPE);
Assert.assertEquals(errorDiagnosticsList.get(9).diagnosticInfo().messageFormat(), UNSUPPORTED_TYPE);
}

@Test
public void testIgnoredCustomHeaderIfAbsentOptions() {
DiagnosticResult diagnosticResult =
CompilerPluginTestUtils.loadPackage("sample_package_7").getCompilation().diagnosticResult();
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.get(0).diagnosticInfo()
.messageFormat(), IGNORE_CUSTOM_HEADERS_PARAMETER_WHEN_HEADER_PRESENT);
Assert.assertEquals(errorDiagnosticsList.get(1).diagnosticInfo()
.messageFormat(), IGNORE_CUSTOM_HEADERS_PARAMETER_WHEN_HEADER_PRESENT);
Assert.assertEquals(errorDiagnosticsList.get(2).diagnosticInfo()
.messageFormat(), IGNORE_CUSTOM_HEADERS_PARAMETER_WHEN_HEADER_PRESENT);
}

@Test
public void testIgnoredOutputHeaderOptions() {
DiagnosticResult diagnosticResult =
CompilerPluginTestUtils.loadPackage("sample_package_8").getCompilation().diagnosticResult();
List<Diagnostic> errorDiagnosticsList = diagnosticResult.diagnostics().stream()
.filter(r -> r.diagnosticInfo().severity().equals(DiagnosticSeverity.ERROR))
.collect(Collectors.toList());
Assert.assertEquals(errorDiagnosticsList.size(), 8);
Assert.assertEquals(errorDiagnosticsList.get(0).diagnosticInfo()
.messageFormat(), IGNORE_OUTPUT_HEADERS_FOR_RECORD_ARRAY);
Assert.assertEquals(errorDiagnosticsList.get(1).diagnosticInfo()
.messageFormat(), IGNORE_OUTPUT_HEADERS_FOR_RECORD_ARRAY);
Assert.assertEquals(errorDiagnosticsList.get(2).diagnosticInfo()
.messageFormat(), IGNORE_CUSTOM_HEADERS_PARAMETER_WHEN_HEADER_PRESENT);
Assert.assertEquals(errorDiagnosticsList.get(3).diagnosticInfo()
.messageFormat(), IGNORE_OUTPUT_HEADERS_FOR_RECORD_ARRAY);
Assert.assertEquals(errorDiagnosticsList.get(4).diagnosticInfo()
.messageFormat(), IGNORE_CUSTOM_HEADERS_PARAMETER_WHEN_HEADER_PRESENT);
Assert.assertEquals(errorDiagnosticsList.get(5).diagnosticInfo()
.messageFormat(), IGNORE_OUTPUT_HEADERS_FOR_RECORD_ARRAY);
Assert.assertEquals(errorDiagnosticsList.get(6).diagnosticInfo()
.messageFormat(), IGNORE_OUTPUT_HEADERS_FOR_RECORD_ARRAY);
Assert.assertEquals(errorDiagnosticsList.get(7).diagnosticInfo()
.messageFormat(), IGNORE_OUTPUT_HEADERS_FOR_RECORD_ARRAY);
}

@Test
public void testIgnoredHeadersOrderOptions() {
DiagnosticResult diagnosticResult =
CompilerPluginTestUtils.loadPackage("sample_package_9").getCompilation().diagnosticResult();
List<Diagnostic> errorDiagnosticsList = diagnosticResult.diagnostics().stream()
.filter(r -> r.diagnosticInfo().severity().equals(DiagnosticSeverity.ERROR))
.collect(Collectors.toList());
Assert.assertEquals(errorDiagnosticsList.size(), 7);
Assert.assertEquals(errorDiagnosticsList.get(0).diagnosticInfo()
.messageFormat(), IGNORE_HEADERS_ORDER_FOR_RECORD_ARRAY);
Assert.assertEquals(errorDiagnosticsList.get(1).diagnosticInfo()
.messageFormat(), IGNORE_OUTPUT_HEADERS_FOR_RECORD_ARRAY);
Assert.assertEquals(errorDiagnosticsList.get(2).diagnosticInfo()
.messageFormat(), IGNORE_HEADERS_ORDER_FOR_RECORD_ARRAY);
Assert.assertEquals(errorDiagnosticsList.get(3).diagnosticInfo()
.messageFormat(), IGNORE_HEADERS_ORDER_FOR_RECORD_ARRAY);
Assert.assertEquals(errorDiagnosticsList.get(4).diagnosticInfo()
.messageFormat(), IGNORE_OUTPUT_HEADERS_FOR_RECORD_ARRAY);
Assert.assertEquals(errorDiagnosticsList.get(5).diagnosticInfo()
.messageFormat(), IGNORE_HEADERS_ORDER_FOR_RECORD_ARRAY);
Assert.assertEquals(errorDiagnosticsList.get(6).diagnosticInfo()
.messageFormat(), IGNORE_OUTPUT_HEADERS_FOR_RECORD_ARRAY);
}

@Test
public void testIgnoredCustomHeaderOptions() {
DiagnosticResult diagnosticResult =
CompilerPluginTestUtils.loadPackage("sample_package_10").getCompilation().diagnosticResult();
List<Diagnostic> errorDiagnosticsList = diagnosticResult.diagnostics().stream()
.filter(r -> r.diagnosticInfo().severity().equals(DiagnosticSeverity.ERROR))
.collect(Collectors.toList());
Assert.assertEquals(errorDiagnosticsList.size(), 12);
Assert.assertEquals(errorDiagnosticsList.get(0).diagnosticInfo()
.messageFormat(), CUSTOM_HEADERS_SHOULD_BE_PROVIDED);
Assert.assertEquals(errorDiagnosticsList.get(1).diagnosticInfo()
.messageFormat(), CUSTOM_HEADERS_SHOULD_BE_PROVIDED);
Assert.assertEquals(errorDiagnosticsList.get(2).diagnosticInfo()
.messageFormat(), CUSTOM_HEADERS_SHOULD_BE_PROVIDED);
Assert.assertEquals(errorDiagnosticsList.get(3).diagnosticInfo()
.messageFormat(), IGNORE_OUTPUT_HEADERS_FOR_RECORD_ARRAY);
Assert.assertEquals(errorDiagnosticsList.get(4).diagnosticInfo()
.messageFormat(), CUSTOM_HEADERS_SHOULD_BE_PROVIDED);
Assert.assertEquals(errorDiagnosticsList.get(5).diagnosticInfo()
.messageFormat(), CUSTOM_HEADERS_SHOULD_BE_PROVIDED);
Assert.assertEquals(errorDiagnosticsList.get(6).diagnosticInfo()
.messageFormat(), CUSTOM_HEADERS_SHOULD_BE_PROVIDED);
Assert.assertEquals(errorDiagnosticsList.get(7).diagnosticInfo()
.messageFormat(), CUSTOM_HEADERS_SHOULD_BE_PROVIDED);
Assert.assertEquals(errorDiagnosticsList.get(8).diagnosticInfo()
.messageFormat(), CUSTOM_HEADERS_SHOULD_BE_PROVIDED);
Assert.assertEquals(errorDiagnosticsList.get(9).diagnosticInfo()
.messageFormat(), IGNORE_OUTPUT_HEADERS_FOR_RECORD_ARRAY);
Assert.assertEquals(errorDiagnosticsList.get(10).diagnosticInfo()
.messageFormat(), CUSTOM_HEADERS_SHOULD_BE_PROVIDED);
Assert.assertEquals(errorDiagnosticsList.get(11).diagnosticInfo()
.messageFormat(), IGNORE_OUTPUT_HEADERS_FOR_RECORD_ARRAY);
}

@Test
public void testNonCsvFunctionCall() {
DiagnosticResult diagnosticResult =
CompilerPluginTestUtils.loadPackage("sample_package_11").getCompilation().diagnosticResult();
List<Diagnostic> errorDiagnosticsList = diagnosticResult.diagnostics().stream()
.filter(r -> r.diagnosticInfo().severity().equals(DiagnosticSeverity.ERROR))
.collect(Collectors.toList());
Assert.assertEquals(errorDiagnosticsList.size(), 0);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
[package]
org = "wso2"
name = "sample_package_10"
version = "0.1.0"
distribution = "2201.9.2"

[build-options]
observabilityIncluded = true
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
import ballerina/data.csv;

string[]? headers = ();

record{}[] _ = check csv:parseList([["1", "2"]], {headersRows: 0});
record{}[] _ = check csv:parseList([["1", "2"]], {headersRows: 0, customHeaders: ["a", "b"]});
record{}[] _ = check csv:parseList([["1", "2"]], {headersRows: 0, customHeaders: ()});
record{}[] _ = check csv:parseList([["1", "2"]], {headersRows: 0, customHeaders: headers});
record{}[] _ = check csv:parseList([["1", "2"]], {headersRows: 1});
record{}[] _ = check csv:parseList([["1", "2"]], {headersRows: 1, customHeaders: ["a", "b"]});
record{}[] _ = check csv:parseList([["1", "2"]], {headersRows: 1, customHeaders: ()});
record{}[] _ = check csv:parseList([["1", "2"]], {headersRows: 1, customHeaders: headers});
record{}[] _ = check csv:parseList([["1", "2"]], {headersRows: 2});
record{}[] _ = check csv:parseList([["1", "2"]], {headersRows: 2, customHeaders: ["a", "b"]});
record{}[] _ = check csv:parseList([["1", "2"]], {headersRows: 2, customHeaders: ()});
record{}[] _ = check csv:parseList([["1", "2"]], {headersRows: 2, customHeaders: null, outputWithHeaders: false});
record{}[] _ = check csv:parseList([["1", "2"]], {headersRows: 2, customHeaders: headers});

public function main() returns error? {
record{}[] val = check csv:parseList([["1", "2"]], {headersRows: 0});
val = check csv:parseList([["1", "2"]], {headersRows: 0});

record{}[] _ = check csv:parseList([["1", "2"]], {headersRows: 0, customHeaders: ["a", "b"]});
val = check csv:parseList([["1", "2"]], {headersRows: 0, customHeaders: ["a", "b"]});

record{}[] _ = check csv:parseList([["1", "2"]], {headersRows: 0, customHeaders: ()});
val = check csv:parseList([["1", "2"]], {headersRows: 0, customHeaders: ()});

record{}[] _ = check csv:parseList([["1", "2"]], {headersRows: 0, customHeaders: headers});
val = check csv:parseList([["1", "2"]], {headersRows: 0, customHeaders: headers});

record{}[] _ = check csv:parseList([["1", "2"]], {headersRows: 1});
val = check csv:parseList([["1", "2"]], {headersRows: 1});

record{}[] _ = check csv:parseList([["1", "2"]], {headersRows: 1, customHeaders: ["a", "b"]});
val = check csv:parseList([["1", "2"]], {headersRows: 1, customHeaders: ["a", "b"]});

record{}[] _ = check csv:parseList([["1", "2"]], {headersRows: 1, customHeaders: ()});
val = check csv:parseList([["1", "2"]], {headersRows: 1, customHeaders: ()});

record{}[] _ = check csv:parseList([["1", "2"]], {headersRows: 1, customHeaders: headers});
val = check csv:parseList([["1", "2"]], {headersRows: 1, customHeaders: headers});

record{}[] _ = check csv:parseList([["1", "2"]], {headersRows: 2});
val = check csv:parseList([["1", "2"]], {headersRows: 2});

record{}[] _ = check csv:parseList([["1", "2"]], {headersRows: 2, customHeaders: ["a", "b"]});
val = check csv:parseList([["1", "2"]], {headersRows: 2, customHeaders: ["a", "b"]});

record{}[] _ = check csv:parseList([["1", "2"]], {headersRows: 2, customHeaders: ()});
val = check csv:parseList([["1", "2"]], {headersRows: 2, customHeaders: ()});

record{}[] _ = check csv:parseList([["1", "2"]], {headersRows: 2, customHeaders: null, outputWithHeaders: true});
val = check csv:parseList([["1", "2"]], {headersRows: 2, customHeaders: null, outputWithHeaders: true});

record{}[] _ = check csv:parseList([["1", "2"]], {headersRows: 2, customHeaders: headers});
val = check csv:parseList([["1", "2"]], {headersRows: 2, customHeaders: headers});
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
[package]
org = "wso2"
name = "sample_package_11"
version = "0.1.0"
distribution = "2201.9.2"

[build-options]
observabilityIncluded = true
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import ballerina/data.csv;

type A record {
int:Unsigned32 headerRows = 0;
string[] customHeaders = [];
boolean outputWithHeaders = false;
};

public function main() returns error? {
record {}[] a = check csv:parseString(string `a,b`, {});
record {}[] b = test({headerRows: 2, outputWithHeaders: false});
}

function test(A a) returns record{}[] {
return [{}];
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
[package]
org = "wso2"
name = "sample_package_7"
version = "0.1.0"
distribution = "2201.9.2"

[build-options]
observabilityIncluded = true
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
import ballerina/data.csv;

string[] customHeaders = ["a", "b"];
int:Unsigned32 header = 0;
false header2 = false;

record{}[] val = check csv:parseString(string `a, b`, {header: 0, customHeadersIfHeadersAbsent: ["a", "b"]});
record{}[] val2 = check csv:parseString(string `a, b`, {header: 0, customHeadersIfHeadersAbsent: ()});
record{}[] val3 = check csv:parseString(string `a, b`, {header: false, customHeadersIfHeadersAbsent: ["a", "b"]});
record{}[] val4 = check csv:parseString(string `a, b`, {header: false, customHeadersIfHeadersAbsent: ()});
record{}[] val5 = check csv:parseString(string `a, b`, {customHeadersIfHeadersAbsent: ()});
record{}[] val6 = check csv:parseString(string `a, b`, {header: false});
record{}[] val7 = check csv:parseString(string `a, b`, {customHeadersIfHeadersAbsent: ["a", "b"]});
record{}[] val8 = check csv:parseString(string `a, b`, {header: 0, customHeadersIfHeadersAbsent: null});
record{}[] val9 = check csv:parseString(string `a, b`, {header: false, customHeadersIfHeadersAbsent: null});
record{}[] val10 = check csv:parseString(string `a, b`, {header: 0, customHeadersIfHeadersAbsent: customHeaders});
record{}[] val11 = check csv:parseString(string `a, b`, {header: header, customHeadersIfHeadersAbsent: customHeaders});
record{}[] val12 = check csv:parseString(string ``, {header: header2, customHeadersIfHeadersAbsent: customHeaders});

public function main() returns error? {
record{}[] val = check csv:parseString(string `a, b`, {header: 0, customHeadersIfHeadersAbsent: ["a", "b"]});
val = check csv:parseString(string ``, {header: 0, customHeadersIfHeadersAbsent: ["a", "b"]});

record{}[] val2 = check csv:parseString(string `a, b`, {header: 0, customHeadersIfHeadersAbsent: ()});
val2 = check csv:parseString(string ``, {header: 0, customHeadersIfHeadersAbsent: ()});

record{}[] val3 = check csv:parseString(string `a, b`, {header: false, customHeadersIfHeadersAbsent: ["a", "b"]});
val3 = check csv:parseString(string ``, {header: false, customHeadersIfHeadersAbsent: ["a", "b"]});

record{}[] val4 = check csv:parseString(string `a, b`, {header: false, customHeadersIfHeadersAbsent: ()});
val4 = check csv:parseString(string ``, {header: false, customHeadersIfHeadersAbsent: ()});

record{}[] val5 = check csv:parseString(string `a, b`, {customHeadersIfHeadersAbsent: ()});
val5 = check csv:parseString(string ``, {customHeadersIfHeadersAbsent: ()});

record{}[] val6 = check csv:parseString(string `a, b`, {header: false});
val6 = check csv:parseString(string ``, {header: false});

record{}[] val7 = check csv:parseString(string `a, b`, {customHeadersIfHeadersAbsent: ["a", "b"]});
val7 = check csv:parseString(string ``, {customHeadersIfHeadersAbsent: ["a", "b"]});

record{}[] val8 = check csv:parseString(string `a, b`, {header: 0, customHeadersIfHeadersAbsent: null});
val8 = check csv:parseString(string ``, {header: 0, customHeadersIfHeadersAbsent: null});

record{}[] val9 = check csv:parseString(string `a, b`, {header: false, customHeadersIfHeadersAbsent: null});
val9 = check csv:parseString(string ``, {header: false, customHeadersIfHeadersAbsent: null});

record{}[] val10 = check csv:parseString(string `a, b`, {header: 0, customHeadersIfHeadersAbsent: customHeaders});
val10 = check csv:parseString(string ``, {header: 0, customHeadersIfHeadersAbsent: customHeaders});

record{}[] val11 = check csv:parseString(string `a, b`, {header: header, customHeadersIfHeadersAbsent: customHeaders});
val11 = check csv:parseString(string `a, b`, {header: header, customHeadersIfHeadersAbsent: customHeaders});

record{}[] val12 = check csv:parseString(string ``, {header: header2, customHeadersIfHeadersAbsent: customHeaders});
val11 = check csv:parseString(string ``, {header: header2, customHeadersIfHeadersAbsent: customHeaders});
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
[package]
org = "wso2"
name = "sample_package_8"
version = "0.1.0"
distribution = "2201.9.2"

[build-options]
observabilityIncluded = true
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import ballerina/data.csv;

boolean o = false;
record{}[] val = check csv:parseString(string `a, b`, {outputWithHeaders: false});
record{}[] val2 = check csv:parseString(string `a, b`, {header: 0, customHeadersIfHeadersAbsent: (), outputWithHeaders: true});
record{}[] val3 = check csv:parseString(string `a, b`, {header: false, customHeadersIfHeadersAbsent: ["a", "b"]});
record{}[] val4 = check csv:parseString(string `a, b`, {header: 0, customHeadersIfHeadersAbsent: (), outputWithHeaders: o});

public function main() returns error? {
record{}[] val = check csv:parseString(string `a, b`, {header: 0, customHeadersIfHeadersAbsent: ["a", "b"], outputWithHeaders: false});
val = check csv:parseString(string ``, {header: 0, customHeadersIfHeadersAbsent: ["a", "b"], outputWithHeaders: true});

record{}[] val2 = check csv:parseString(string `a, b`, {header: 0, customHeadersIfHeadersAbsent: (), outputWithHeaders: false});
val2 = check csv:parseString(string ``, {header: 0, customHeadersIfHeadersAbsent: (), outputWithHeaders: true});

record{}[] val3 = check csv:parseString(string `a, b`, {header: 0, customHeadersIfHeadersAbsent: (), outputWithHeaders: o});
val3 = check csv:parseString(string ``, {header: 0, customHeadersIfHeadersAbsent: (), outputWithHeaders: o});
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
[package]
org = "wso2"
name = "sample_package_9"
version = "0.1.0"
distribution = "2201.9.2"

[build-options]
observabilityIncluded = true
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import ballerina/data.csv;

boolean o = false;
string[] headersOrder = ["a", "b"];
record{}[] val = check csv:transform([{"a": 1, "b": 2}], {headersOrder: ["a", "b"], outputWithHeaders: false});
record{}[] val2 = check csv:transform([{"a": 1, "b": 2}], {headersOrder: ["a", "b"]});
record{}[] val3 = check csv:transform([{"a": 1, "b": 2}], {"header": false, headersOrder: headersOrder});
record{}[] val4 = check csv:transform([{"a": 1, "b": 2}], {outputWithHeaders: o, headersOrder: ()});

public function main() returns error? {
record{}[] val = check csv:transform([{"a": 1, "b": 2}], {headersOrder: ()});
val = check csv:transform([{"a": 1, "b": 2}], {headersOrder: ()});

record{}[] val2 = check csv:transform([{"a": 1, "b": 2}], {headersOrder: ["a", "b"], outputWithHeaders: false});
val2 = check csv:transform([{"a": 1, "b": 2}], {headersOrder: ["a", "b"], outputWithHeaders: true});

record{}[] val3 = check csv:transform([{"a": 1, "b": 2}], {headersOrder: null});
val3 = check csv:transform([{"a": 1, "b": 2}], {headersOrder: null});

record{}[] val4 = check csv:transform([{"a": 1, "b": 2}], {headersOrder});
val4 = check csv:transform([{"a": 1, "b": 2}], {headersOrder});
}
Loading

0 comments on commit 95720c0

Please sign in to comment.