0
0
mirror of https://github.com/ankidroid/Anki-Android.git synced 2024-09-19 19:42:17 +02:00

Detect invalid capital letters

This commit is contained in:
sharkbird 2023-09-24 03:44:38 -04:00 committed by Brayan Oliveira
parent 100f219b09
commit d0e16f7d56
2 changed files with 108 additions and 1 deletions

View File

@ -36,8 +36,11 @@ import java.util.*
import java.util.regex.Pattern
/**
* Fix for "Linting Error - String format should be valid."
* Fix for 2 issues
* 1. "Linting Error - String format should be valid."
* [https://github.com/ankidroid/Anki-Android/issues/10604](https://github.com/ankidroid/Anki-Android/issues/10604)
* 2."Check formatters like %1$D"
* https://github.com/ankidroid/Anki-Android/issues/14079
*/
class InvalidStringFormatDetector : ResourceXmlDetector() {
companion object {
@ -58,6 +61,14 @@ class InvalidStringFormatDetector : ResourceXmlDetector() {
)
private val INVALID_FORMAT_PATTERN = Pattern.compile("[^%]+%").toRegex()
/**
* (?<!%)% => should match %, but does not match if there's another % immediately to the left
* [^%a-zA-Z]* => should match any characters (zero or more) that are not %, alphabetical or whitespace
* [DFNOGC] => should match any of the capital characters that cause the errors
* .* => can match any non whitespace characters (zero or more) following the format specifier
*/
private val INVALID_CAPITALIZATION = Pattern.compile("(?<!%)%[^%a-zA-Z]*[DFNOGC].*").toRegex()
}
override fun appliesTo(folderType: ResourceFolderType): Boolean =
@ -104,6 +115,19 @@ class InvalidStringFormatDetector : ResourceXmlDetector() {
"eg: 'I have completed% %s cards.' "
)
}
if (it.matches(INVALID_CAPITALIZATION)) {
val location = context.createLocationHandle(element).resolve()
context.report(
ISSUE,
location,
"Formatted string should not use capital letter. " +
"eg: %D, %1D, %9D, %-9D, %1\$D, " +
"%F, %1F, %9F, %-9F, %1\$F, " +
"%N, %O, %G, %C " +
"should all be in lowercase."
)
}
}
}
}

View File

@ -54,6 +54,66 @@ class InvalidStringFormatDetectorTest {
|</resources>
""".trimMargin()
@Language("XML")
private val invalidCapitalization = """<resources>
|<string name="testString">%D</string>
|<string name="testString2">%1D</string>
|<string name="testString3">%9D</string>
|<string name="testString4">%-9D</string>
|<string name="testString5">%1${'$'}D</string>
|<string name="testString6">%F</string>
|<string name="testString7">%1F</string>
|<string name="testString8">%9F</string>
|<string name="testString9">%-9F</string>
|<string name="testString10">%1${'$'}F</string>
|<string name="testString11">%N</string>
|<string name="testString12">%O</string>
|<string name="testString13">%G</string>
|<string name="testString14">%C</string>
|<string name="testString15">%D %1D %9D %-9D %1${'$'}D %F %1F %9F %-9F %1${'$'}F %N %O %G %C</string>
|<string name="testString16">% %D</string>
|<string name="testString17">%D%</string>
|<string name="testString18">%D%%</string>
|<plurals name="pluralTestString1">
<item quantity="other">%2${'$'}D</item>
</plurals>
|</resources>
""".trimMargin()
@Language("XML")
private val validCapitalization = """<resources>
|<string name="testString">%d</string>
|<string name="testString2">%1d</string>
|<string name="testString3">%9d</string>
|<string name="testString4">%-9d</string>
|<string name="testString5">%1${'$'}d</string>
|<string name="testString6">%f</string>
|<string name="testString7">%1f</string>
|<string name="testString8">%9f</string>
|<string name="testString9">%-9f</string>
|<string name="testString10">%1${'$'}f</string>
|<string name="testString11">%n</string>
|<string name="testString12">%o</string>
|<string name="testString13">%g</string>
|<string name="testString14">%c</string>
|<string name="testString15">%d %1d %9d %-9d %1${'$'}d %f %1f %9f %-9f %1${'$'}f %n %o %g %c</string>
|<string name="testString16">% %d</string>
|<string name="testString16">%%D</string>
|<string name="testString17">% D</string>
|<string name="testString18">%d%</string>
|<string name="testString19">%d%%</string>
|<string name="testString20">%abcd</string>
|<string name="testString21">%S %X %T %E %H %B %A</string>
|<string name="testString22">%S %1S %9S %-9S %1${'$'}S</string>
|<string name="testString23">%1{'$'}d\nDatabase version</string>
|<string name="testString24">%abcD</string>
|<string name="testString25">%abcDefg</string>
|<plurals name="pluralTestString1">
<item quantity="other">Hello hello %2${'$'}d hello hello</item>
</plurals>
|</resources>
""".trimMargin()
@Test
fun error_if_string_format_invalid() {
TestLintTask.lint()
@ -76,4 +136,27 @@ class InvalidStringFormatDetectorTest {
.run()
.expectClean()
}
@Test
fun error_if_capitalization_invalid() {
TestLintTask.lint()
.allowMissingSdk()
.allowCompilationErrors()
.allowDuplicates()
.files(TestFiles.xml("res/values/string.xml", invalidCapitalization))
.issues(InvalidStringFormatDetector.ISSUE)
.run()
.expectErrorCount(19)
}
@Test
fun no_error_if_capitalization_valid() {
TestLintTask.lint()
.allowMissingSdk()
.allowCompilationErrors()
.files(TestFiles.xml("res/values/string.xml", validCapitalization))
.issues(InvalidStringFormatDetector.ISSUE)
.run()
.expectClean()
}
}