diff --git a/regression/strings-smoke-tests/java_case/test.desc b/regression/strings-smoke-tests/java_case/test.desc index 9a254ae3484..d2508fa3489 100644 --- a/regression/strings-smoke-tests/java_case/test.desc +++ b/regression/strings-smoke-tests/java_case/test.desc @@ -1,7 +1,12 @@ CORE test_case.class --refine-strings -^EXIT=0$ +^EXIT=10$ ^SIGNAL=0$ -^VERIFICATION SUCCESSFUL$ +assertion.* file test_case.java line 10 .* SUCCESS$ +assertion.* file test_case.java line 11 .* SUCCESS$ +assertion.* file test_case.java line 12 .* SUCCESS$ +assertion.* file test_case.java line 16 .* FAILURE$ +assertion.* file test_case.java line 20 .* SUCCESS$ +assertion.* file test_case.java line 24 .* FAILURE$ -- diff --git a/regression/strings-smoke-tests/java_case/test_case.class b/regression/strings-smoke-tests/java_case/test_case.class index 9f7eaab446c..863da75113c 100644 Binary files a/regression/strings-smoke-tests/java_case/test_case.class and b/regression/strings-smoke-tests/java_case/test_case.class differ diff --git a/regression/strings-smoke-tests/java_case/test_case.java b/regression/strings-smoke-tests/java_case/test_case.java index b3437a6f83e..088ee70803e 100644 --- a/regression/strings-smoke-tests/java_case/test_case.java +++ b/regression/strings-smoke-tests/java_case/test_case.java @@ -1,12 +1,27 @@ public class test_case { - public static void main(/*String[] argv*/) - { - String s = new String("Ab"); - String l = s.toLowerCase(); - String u = s.toUpperCase(); - assert(l.equals("ab")); - assert(u.equals("AB")); - assert(s.equalsIgnoreCase("aB")); - } + public static void main(int i) + { + String s = new String("Ab"); + String l = s.toLowerCase(); + String u = s.toUpperCase(); + if(i==1) + { + assert(l.equals("ab")); + assert(u.equals("AB")); + assert(s.equalsIgnoreCase("aB")); + } + else if(i==2) + { + assert(!u.equals("AB")); + } + else if(i==3) + { + assert("ÖÇ".toLowerCase().equals("öç")); + } + else + { + assert(!"ÖÇ".toLowerCase().equals("öç")); + } + } } diff --git a/src/solvers/refinement/string_constraint_generator_transformation.cpp b/src/solvers/refinement/string_constraint_generator_transformation.cpp index 599ae3af9dd..bde386d3eda 100644 --- a/src/solvers/refinement/string_constraint_generator_transformation.cpp +++ b/src/solvers/refinement/string_constraint_generator_transformation.cpp @@ -214,36 +214,58 @@ string_exprt string_constraint_generatort::add_axioms_for_to_lower_case( const typet &char_type=ref_type.get_char_type(); const typet &index_type=ref_type.get_index_type(); string_exprt res=fresh_string(ref_type); - exprt char_a=constant_char('a', char_type); - exprt char_A=constant_char('A', char_type); - exprt char_z=constant_char('z', char_type); - exprt char_Z=constant_char('Z', char_type); + const exprt char_A=constant_char('A', char_type); + const exprt char_Z=constant_char('Z', char_type); - // TODO: add support for locales using case mapping information - // from the UnicodeData file. + + // TODO: for now, only characters in Basic Latin and Latin-1 supplement + // are supported (up to 0x100), we should add others using case mapping + // information from the UnicodeData file. // We add axioms: // a1 : |res| = |str| - // a2 : forall idx res[idx]=str[idx]+'a'-'A' - // a3 : forall idx res[idx]=str[idx] - // forall idx