Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
8c03d8b
added Java support for missing predefined character classes escapes (…
lmasroca Oct 22, 2025
147d40c
added Java support for POSIX character classes (\p{Lower}, \p{Print},…
lmasroca Oct 23, 2025
7f40c66
Merge remote-tracking branch 'origin/external-pr-lmasroca' into exter…
lmasroca Oct 27, 2025
74b6136
Merge remote-tracking branch 'origin/master' into external-pr-lmasroca
lmasroca Oct 27, 2025
8db3796
Merge remote-tracking branch 'origin/master' into external-pr-lmasroca
lmasroca Oct 28, 2025
fa88731
added a comment
lmasroca Oct 28, 2025
2c9793c
Regex support for negated character classes, improved and optimized c…
lmasroca Nov 4, 2025
5ce41e2
Merge remote-tracking branch 'origin/master' into external-pr-lmasroca
lmasroca Nov 4, 2025
75385cf
Merge remote-tracking branch 'origin/master' into external-pr-lmasroca
lmasroca Nov 5, 2025
bc91846
Merge remote-tracking branch 'origin/master' into external-pr-lmasroca
lmasroca Nov 6, 2025
3a863c7
added some comments
lmasroca Nov 7, 2025
1c7861c
Merge remote-tracking branch 'origin/master' into external-pr-lmasroca
lmasroca Nov 11, 2025
8c31907
trying a fix
lmasroca Nov 11, 2025
bd17853
Merge remote-tracking branch 'refs/remotes/origin/master' into extern…
lmasroca Nov 25, 2025
897f04b
increasing iterations for an e2e test to account for changes in rando…
lmasroca Nov 25, 2025
19b336c
Merge remote-tracking branch 'origin/master' into external-pr-lmasroca
lmasroca Dec 5, 2025
56a7462
Disabled dto for TaintNestedEMTest from openapi-v2 E2E tests as CI cu…
lmasroca Dec 5, 2025
a0d3ea9
Merge remote-tracking branch 'refs/remotes/origin/master' into extern…
lmasroca Jan 16, 2026
22461a1
Merge remote-tracking branch 'origin/master' into external-pr-lmasroca
lmasroca Feb 25, 2026
bd9a0f1
Merge remote-tracking branch 'origin/master' into external-pr-lmasroca
lmasroca Mar 12, 2026
a1d1e32
Add required field to spec
Pgarrett Mar 14, 2026
7c851fc
Merge remote-tracking branch 'origin/master' into external-pr-lmasroca
lmasroca Mar 16, 2026
4d360dd
Merge remote-tracking branch 'origin/external-pr-lmasroca' into exter…
lmasroca Mar 16, 2026
e9780d9
Revert "Disabled dto for TaintNestedEMTest from openapi-v2 E2E tests …
lmasroca Mar 17, 2026
fededcf
Requested changes pt.1
lmasroca Mar 18, 2026
9822f49
Requested changes pt.2
lmasroca Mar 18, 2026
09cf21d
Merge remote-tracking branch 'origin/master' into external-pr-lmasroca
lmasroca Mar 18, 2026
7327816
Merge remote-tracking branch 'origin/master' into external-pr-lmasroca
lmasroca Mar 19, 2026
719c148
Solved TODO related to negated character classes in GeneSamplerForTes…
lmasroca Mar 19, 2026
02fcfc4
Merge remote-tracking branch 'origin/master' into external-pr-lmasroca
lmasroca Mar 20, 2026
fc407bf
Increasing iterations for e2e test
lmasroca Mar 20, 2026
abefd64
Requested changes
lmasroca Mar 26, 2026
f848529
Moved CharacterRange class to src/main/kotlin/org/evomaster/core/utils
lmasroca Mar 27, 2026
0c881c0
Moved predefined character class definitions from Randomness.kt to Ch…
lmasroca Mar 30, 2026
bfb0aca
Reversed iterations increase as new changes made the increase unneces…
lmasroca Mar 30, 2026
9ba041d
Merge remote-tracking branch 'refs/remotes/origin/master' into extern…
lmasroca Mar 30, 2026
2c114aa
Moved some logic regarding the construction of valid ranges from Char…
lmasroca Mar 30, 2026
df807cc
Increasing iterations for e2e test
lmasroca Mar 30, 2026
3a0afa1
Added a some comments
lmasroca Mar 30, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ public void testFindOneOnGivenEndpoint(String endpoint) throws Throwable {
runTestHandlingFlaky(
"MongoFindOneByEM_" + id,
"org.foo.spring.rest.mongo.MongoFindOneByEM"+id,
1000,
2000,
true,
(args) -> {
setOption(args, "taintForceSelectionOfGenesWithSpecialization", "true");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,7 @@ paths:
- aDouble
- aFloat
- aBoolean
- aNullableString
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why this change?
@Pgarrett you wrote this file, isn't it? what is your opinion on this change?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes I did, it seemed one of the fields was not being generated in the test and thus causing the test to fail in the reflective assertions

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No concern on my side

responses:
'200':
description: OK
Expand Down
26 changes: 24 additions & 2 deletions core/src/main/antlr4/org/evomaster/core/parser/RegexJava.g4
Original file line number Diff line number Diff line change
Expand Up @@ -125,9 +125,29 @@ fragment CharacterEscape
| HexEscapeSequence
| UnicodeEscapeSequence
| OctalEscapeSequence
| 'p' BRACE_open PosixCharacterClassLabel BRACE_close // this is only implemented in Java at the moment as on JS this
// is allowed only while certain flags are enabled
//| IdentityEscape
;

// basic US-ASCII only predefined POSIX character classes
// https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html#:~:text=character%3A%20%5B%5E%5Cw%5D-,POSIX,-character%20classes%20(US
fragment PosixCharacterClassLabel
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

provide reference link from where those values were taken from. recall the comments at the top of this file

: 'Lower'
| 'Upper'
| 'ASCII'
| 'Alpha'
| 'Digit'
| 'Alnum'
| 'Punct'
| 'Graph'
| 'Print'
| 'Blank'
| 'Cntrl'
| 'XDigit'
| 'Space'
;

fragment ControlEscape
//one of f n r t v
: [aefnrt]
Expand Down Expand Up @@ -233,8 +253,10 @@ AtomEscape
;

fragment CharacterClassEscape
//one of d D s S w W
: [dDsSwW]
//one of d D s S w W v V h H
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

as v V h H are non-standard, and specific to Java, add a comment to explain them here

// v, V, h and H are java8 exclusive, they represent vertical spaces and horizaontal spaces respectively
// see https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html for more information
: [dDsSwWvVhH]
;


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package org.evomaster.core.parser

import org.evomaster.core.search.gene.Gene
import org.evomaster.core.search.gene.regex.*
import org.evomaster.core.utils.CharacterRange

/**
* Created by arcuri82 on 12-Jun-19.
Expand Down Expand Up @@ -181,7 +182,7 @@ class GenePostgresSimilarToVisitor : PostgresSimilarToBaseVisitor<VisitResult>()

val negated = ctx.CARET() != null

val ranges = ctx.classRanges().accept(this).data as List<Pair<Char,Char>>
val ranges = ctx.classRanges().accept(this).data as List<CharacterRange>

val gene = CharacterRangeRxGene(negated, ranges)

Expand All @@ -191,10 +192,10 @@ class GenePostgresSimilarToVisitor : PostgresSimilarToBaseVisitor<VisitResult>()
override fun visitClassRanges(ctx: PostgresSimilarToParser.ClassRangesContext): VisitResult {

val res = VisitResult()
val list = mutableListOf<Pair<Char,Char>>()
val list = mutableListOf<CharacterRange>()

if(ctx.nonemptyClassRanges() != null){
val ranges = ctx.nonemptyClassRanges().accept(this).data as List<Pair<Char,Char>>
val ranges = ctx.nonemptyClassRanges().accept(this).data as List<CharacterRange>
list.addAll(ranges)
}

Expand All @@ -205,7 +206,7 @@ class GenePostgresSimilarToVisitor : PostgresSimilarToBaseVisitor<VisitResult>()

override fun visitNonemptyClassRanges(ctx: PostgresSimilarToParser.NonemptyClassRangesContext): VisitResult {

val list = mutableListOf<Pair<Char,Char>>()
val list = mutableListOf<CharacterRange>()

val startText = ctx.classAtom()[0].text
assert(startText.length == 1) // single chars
Expand All @@ -218,15 +219,15 @@ class GenePostgresSimilarToVisitor : PostgresSimilarToBaseVisitor<VisitResult>()
start
}

list.add(Pair(start, end))
list.add(CharacterRange(start, end))

if(ctx.nonemptyClassRangesNoDash() != null){
val ranges = ctx.nonemptyClassRangesNoDash().accept(this).data as List<Pair<Char,Char>>
val ranges = ctx.nonemptyClassRangesNoDash().accept(this).data as List<CharacterRange>
list.addAll(ranges)
}

if(ctx.classRanges() != null){
val ranges = ctx.classRanges().accept(this).data as List<Pair<Char,Char>>
val ranges = ctx.classRanges().accept(this).data as List<CharacterRange>
list.addAll(ranges)
}

Expand All @@ -239,27 +240,27 @@ class GenePostgresSimilarToVisitor : PostgresSimilarToBaseVisitor<VisitResult>()

override fun visitNonemptyClassRangesNoDash(ctx: PostgresSimilarToParser.NonemptyClassRangesNoDashContext): VisitResult {

val list = mutableListOf<Pair<Char,Char>>()
val list = mutableListOf<CharacterRange>()

if(ctx.MINUS() != null){

val start = ctx.classAtomNoDash().text[0]
val end = ctx.classAtom().text[0]
list.add(Pair(start, end))
list.add(CharacterRange(start, end))

} else {

val char = (ctx.classAtom() ?: ctx.classAtomNoDash()).text[0]
list.add(Pair(char, char))
list.add(CharacterRange(char, char))
}

if(ctx.nonemptyClassRangesNoDash() != null){
val ranges = ctx.nonemptyClassRangesNoDash().accept(this).data as List<Pair<Char,Char>>
val ranges = ctx.nonemptyClassRangesNoDash().accept(this).data as List<CharacterRange>
list.addAll(ranges)
}

if(ctx.classRanges() != null){
val ranges = ctx.classRanges().accept(this).data as List<Pair<Char,Char>>
val ranges = ctx.classRanges().accept(this).data as List<CharacterRange>
list.addAll(ranges)
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package org.evomaster.core.parser

import org.evomaster.core.search.gene.regex.*
import org.evomaster.core.utils.CharacterRange

private const val EOF_TOKEN = "<EOF>"
/**
Expand Down Expand Up @@ -238,7 +239,7 @@ class GeneRegexEcma262Visitor : RegexEcma262BaseVisitor<VisitResult>(){

val negated = ctx.CARET() != null

val ranges = ctx.classRanges().accept(this).data as List<Pair<Char,Char>>
val ranges = ctx.classRanges().accept(this).data as List<CharacterRange>

val gene = CharacterRangeRxGene(negated, ranges)

Expand All @@ -248,10 +249,10 @@ class GeneRegexEcma262Visitor : RegexEcma262BaseVisitor<VisitResult>(){
override fun visitClassRanges(ctx: RegexEcma262Parser.ClassRangesContext): VisitResult {

val res = VisitResult()
val list = mutableListOf<Pair<Char,Char>>()
val list = mutableListOf<CharacterRange>()

if(ctx.nonemptyClassRanges() != null){
val ranges = ctx.nonemptyClassRanges().accept(this).data as List<Pair<Char,Char>>
val ranges = ctx.nonemptyClassRanges().accept(this).data as List<CharacterRange>
list.addAll(ranges)
}

Expand All @@ -262,7 +263,7 @@ class GeneRegexEcma262Visitor : RegexEcma262BaseVisitor<VisitResult>(){

override fun visitNonemptyClassRanges(ctx: RegexEcma262Parser.NonemptyClassRangesContext): VisitResult {

val list = mutableListOf<Pair<Char,Char>>()
val list = mutableListOf<CharacterRange>()

val startText = ctx.classAtom()[0].text
assert(startText.length == 1) // single chars
Expand All @@ -275,15 +276,15 @@ class GeneRegexEcma262Visitor : RegexEcma262BaseVisitor<VisitResult>(){
start
}

list.add(Pair(start, end))
list.add(CharacterRange(start, end))

if(ctx.nonemptyClassRangesNoDash() != null){
val ranges = ctx.nonemptyClassRangesNoDash().accept(this).data as List<Pair<Char,Char>>
val ranges = ctx.nonemptyClassRangesNoDash().accept(this).data as List<CharacterRange>
list.addAll(ranges)
}

if(ctx.classRanges() != null){
val ranges = ctx.classRanges().accept(this).data as List<Pair<Char,Char>>
val ranges = ctx.classRanges().accept(this).data as List<CharacterRange>
list.addAll(ranges)
}

Expand All @@ -296,27 +297,27 @@ class GeneRegexEcma262Visitor : RegexEcma262BaseVisitor<VisitResult>(){

override fun visitNonemptyClassRangesNoDash(ctx: RegexEcma262Parser.NonemptyClassRangesNoDashContext): VisitResult {

val list = mutableListOf<Pair<Char,Char>>()
val list = mutableListOf<CharacterRange>()

if(ctx.MINUS() != null){

val start = ctx.classAtomNoDash().text[0]
val end = ctx.classAtom().text[0]
list.add(Pair(start, end))
list.add(CharacterRange(start, end))

} else {

val char = (ctx.classAtom() ?: ctx.classAtomNoDash()).text[0]
list.add(Pair(char, char))
list.add(CharacterRange(char, char))
}

if(ctx.nonemptyClassRangesNoDash() != null){
val ranges = ctx.nonemptyClassRangesNoDash().accept(this).data as List<Pair<Char,Char>>
val ranges = ctx.nonemptyClassRangesNoDash().accept(this).data as List<CharacterRange>
list.addAll(ranges)
}

if(ctx.classRanges() != null){
val ranges = ctx.classRanges().accept(this).data as List<Pair<Char,Char>>
val ranges = ctx.classRanges().accept(this).data as List<CharacterRange>
list.addAll(ranges)
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package org.evomaster.core.parser

import org.evomaster.core.search.gene.regex.*
import org.evomaster.core.utils.CharacterRange

private const val EOF_TOKEN = "<EOF>"
/**
Expand Down Expand Up @@ -232,7 +233,7 @@ class GeneRegexJavaVisitor : RegexJavaBaseVisitor<VisitResult>(){
)
)
}
else -> return VisitResult(CharacterClassEscapeRxGene(txt[1].toString()))
else -> return VisitResult(CharacterClassEscapeRxGene(txt.substring(1)))
}
}

Expand Down Expand Up @@ -281,7 +282,7 @@ class GeneRegexJavaVisitor : RegexJavaBaseVisitor<VisitResult>(){

val negated = ctx.CARET() != null

val ranges = ctx.classRanges().accept(this).data as List<Pair<Char,Char>>
val ranges = ctx.classRanges().accept(this).data as List<CharacterRange>

val gene = CharacterRangeRxGene(negated, ranges)

Expand All @@ -291,10 +292,10 @@ class GeneRegexJavaVisitor : RegexJavaBaseVisitor<VisitResult>(){
override fun visitClassRanges(ctx: RegexJavaParser.ClassRangesContext): VisitResult {

val res = VisitResult()
val list = mutableListOf<Pair<Char,Char>>()
val list = mutableListOf<CharacterRange>()

if(ctx.nonemptyClassRanges() != null){
val ranges = ctx.nonemptyClassRanges().accept(this).data as List<Pair<Char,Char>>
val ranges = ctx.nonemptyClassRanges().accept(this).data as List<CharacterRange>
list.addAll(ranges)
}

Expand All @@ -305,7 +306,7 @@ class GeneRegexJavaVisitor : RegexJavaBaseVisitor<VisitResult>(){

override fun visitNonemptyClassRanges(ctx: RegexJavaParser.NonemptyClassRangesContext): VisitResult {

val list = mutableListOf<Pair<Char,Char>>()
val list = mutableListOf<CharacterRange>()

val startText = ctx.classAtom()[0].text
assert(startText.length == 1 || startText.length==2) // single chars or \+ and \. escaped chars
Expand All @@ -330,15 +331,15 @@ class GeneRegexJavaVisitor : RegexJavaBaseVisitor<VisitResult>(){
end = start
}

list.add(Pair(start, end))
list.add(CharacterRange(start, end))

if(ctx.nonemptyClassRangesNoDash() != null){
val ranges = ctx.nonemptyClassRangesNoDash().accept(this).data as List<Pair<Char,Char>>
val ranges = ctx.nonemptyClassRangesNoDash().accept(this).data as List<CharacterRange>
list.addAll(ranges)
}

if(ctx.classRanges() != null){
val ranges = ctx.classRanges().accept(this).data as List<Pair<Char,Char>>
val ranges = ctx.classRanges().accept(this).data as List<CharacterRange>
list.addAll(ranges)
}

Expand All @@ -351,27 +352,27 @@ class GeneRegexJavaVisitor : RegexJavaBaseVisitor<VisitResult>(){

override fun visitNonemptyClassRangesNoDash(ctx: RegexJavaParser.NonemptyClassRangesNoDashContext): VisitResult {

val list = mutableListOf<Pair<Char,Char>>()
val list = mutableListOf<CharacterRange>()

if(ctx.MINUS() != null){

val start = ctx.classAtomNoDash().text[0]
val end = ctx.classAtom().text[0]
list.add(Pair(start, end))
list.add(CharacterRange(start, end))

} else {

val char = (ctx.classAtom() ?: ctx.classAtomNoDash()).text[0]
list.add(Pair(char, char))
list.add(CharacterRange(char, char))
}

if(ctx.nonemptyClassRangesNoDash() != null){
val ranges = ctx.nonemptyClassRangesNoDash().accept(this).data as List<Pair<Char,Char>>
val ranges = ctx.nonemptyClassRangesNoDash().accept(this).data as List<CharacterRange>
list.addAll(ranges)
}

if(ctx.classRanges() != null){
val ranges = ctx.classRanges().accept(this).data as List<Pair<Char,Char>>
val ranges = ctx.classRanges().accept(this).data as List<CharacterRange>
list.addAll(ranges)
}

Expand Down
Loading
Loading