blob: d116b6e2d29c097a02049181d76b9b0e96daa752 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010, 2018 Eclipse Modeling Project and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v20.html
*
* Contributors:
* L.Goubet, E.D.Willink - Initial API and implementation
*******************************************************************************/
package org.eclipse.ocl.examples.pivot.tests;
import java.util.Arrays;
import java.util.Collection;
import java.util.regex.PatternSyntaxException;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.ocl.pivot.internal.messages.PivotMessagesInternal;
import org.eclipse.ocl.pivot.messages.PivotMessages;
import org.eclipse.ocl.pivot.utilities.OCL;
import org.eclipse.ocl.pivot.utilities.StringUtil;
import org.eclipse.osgi.util.NLS;
import org.junit.After;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
/**
* Tests for String operations.
*/
@RunWith(value = Parameterized.class)
public class EvaluateStringOperationsTest4 extends PivotTestSuite
{
@Parameters
public static Collection<Object[]> data() {
Object[][] data = new Object[][]{{false}, {true}};
return Arrays.asList(data);
}
public EvaluateStringOperationsTest4(boolean useCodeGen) {
super(useCodeGen);
}
@Override
protected @NonNull TestOCL createOCL() {
return new TestOCL(getTestFileSystem(), getTestPackageName(), getName(), useCodeGen ? getProjectMap() : OCL.NO_PROJECTS);
}
@Override
protected @NonNull String getTestPackageName() {
return "EvaluateStringOperations";
}
@BeforeClass public static void resetCounter() throws Exception {
PivotTestSuite.resetCounter();
}
@Override
@Before public void setUp() throws Exception {
super.setUp();
}
@Override
@After public void tearDown() throws Exception {
super.tearDown();
}
@Test public void testStringAt() {
TestOCL ocl = createOCL();
ocl.assertQueryEquals(null, "t", "'test'.at(1)");
ocl.assertQueryEquals(null, "e", "'test'.at(2)");
ocl.assertQueryEquals(null, "t", "'test'.at(4)");
// out of bounds
ocl.assertQueryInvalid(null, "'test'.at(0)");
ocl.assertQueryInvalid(null, "'test'.at(5)");
ocl.assertQueryInvalid(null, "''.at(1)");
// invalid
ocl.assertQueryInvalid(null, "let s : String = invalid in s.at(1)");
// null
ocl.assertQueryInvalid(null, "let s : String = null in s.at(1)");
ocl.dispose();
}
@Test public void testStringCharacters() {
TestOCL ocl = createOCL();
ocl.assertQueryEquals(null, new String[] {}, "''.characters()");
ocl.assertQueryEquals(null, new String[] {"a"}, "'a'.characters()");
ocl.assertQueryEquals(null, new String[] {"a", "\r", "\n", "b"}, "'a\\r\nb'.characters()");
// invalid
ocl.assertQueryInvalid(null, "let s : String = invalid in s.characters()");
// null
ocl.assertQueryInvalid(null, "let s : String = null in s.characters()");
ocl.dispose();
}
@Test public void testStringConcat() {
TestOCL ocl = createOCL();
ocl.assertQueryEquals(null, "concatenationTest", "'concatenation'.concat('Test')");
ocl.assertQueryEquals(null, "concatenation\n", "'concatenation'.concat('\\n')");
// invalid
ocl.assertQueryInvalid(null, "let s : String = invalid in 'concatenation'.concat(s)");
ocl.assertQueryInvalid(null, "let s : String = invalid in s.concat('concatenation')");
// null
ocl.assertQueryInvalid(null, "let s : String = null in 'concatenation'.concat(s)");
ocl.assertQueryInvalid(null, "let s : String = null in s.concat('concatenation')");
ocl.dispose();
}
@Test public void testStringEndsWith() {
TestOCL ocl = createOCL();
ocl.assertQueryFalse(null, "'abcdef'.endsWith('aabcdef')");
ocl.assertQueryTrue(null, "'abcdef'.endsWith('abcdef')");
ocl.assertQueryTrue(null, "'abcdef'.endsWith('cdef')");
ocl.assertQueryTrue(null, "'abcdef'.endsWith('f')");
ocl.assertQueryTrue(null, "'abcdef'.endsWith('')");
ocl.assertQueryTrue(null, "''.endsWith('')");
ocl.assertQueryFalse(null, "''.endsWith('a')");
ocl.assertQueryTrue(null, "'abcdef'.endsWith('')");
ocl.assertQueryFalse(null, "'abcdef'.endsWith('bcd')");
ocl.assertQueryFalse(null, "'abcdef'.endsWith('ab')");
ocl.assertQueryFalse(null, "'abcdef'.endsWith('a')");
// invalid
ocl.assertQueryInvalid(null, "let s : String = invalid in s.endsWith('')");
ocl.assertQueryInvalid(null, "let s : String = invalid in ''.endsWith(s)");
// null
ocl.assertQueryInvalid(null, "let s : String = null in s.endsWith('')");
ocl.assertQueryInvalid(null, "let s : String = null in ''.endsWith(s)");
ocl.dispose();
}
@Test public void testStringEqual() {
TestOCL ocl = createOCL();
ocl.assertQueryFalse(null, "'test' = 'se'");
ocl.assertQueryTrue(null, "'test' = 'test'");
ocl.assertQueryFalse(null, "'tESt' = 'TesT'");
// invalid
ocl.assertQueryInvalid(null, "let s : String = invalid in s = 'se'");
ocl.assertQueryInvalid(null, "let s : String = invalid in 'test' = s");
ocl.assertQueryInvalid(null, "let s1 : String = invalid, s2 : String = invalid in s1 = s2");
// null
ocl.assertQueryFalse(null, "let s : String = null in s = 'se'");
ocl.assertQueryFalse(null, "let s : String = null in 'test' = s");
ocl.assertQueryTrue(null, "let s1 : String = null, s2 : String = null in s1 = s2");
ocl.dispose();
}
@Test public void testStringEqualIgnoresCase() {
TestOCL ocl = createOCL();
ocl.assertQueryFalse(null, "'test'.equalsIgnoreCase('se')");
ocl.assertQueryTrue(null, "'test'.equalsIgnoreCase('test')");
ocl.assertQueryTrue(null, "'Test'.equalsIgnoreCase('tEst')");
ocl.assertQueryTrue(null, "'tesT'.equalsIgnoreCase('teSt')");
ocl.assertQueryTrue(null, "'TEST'.equalsIgnoreCase('test')");
ocl.assertQueryTrue(null, "'test'.equalsIgnoreCase('TEST')");
ocl.dispose();
}
@Test public void testStringGreaterThan() {
TestOCL ocl = createOCL();
// FIXME Analyzer-extraOperation String::> should not be defined
ocl.assertQueryFalse(null, "'3' > '4'");
ocl.assertQueryFalse(null, "'a' > 'b'");
ocl.assertQueryFalse(null, "'aardvark' > 'aardvarks'");
ocl.assertQueryTrue(null, "'3.2' > '3.1'");
ocl.assertQueryTrue(null, "'a' > 'A'");
ocl.assertQueryTrue(null, "'aardvark' > 'aardvarK'");
ocl.assertQueryFalse(null, "'3' > '3'");
ocl.assertQueryFalse(null, "'a' > 'a'");
ocl.assertQueryFalse(null, "'aardvark' > 'aardvark'");
// invalid
ocl.assertQueryInvalid(null, "let s : String = invalid in s > 'se'");
ocl.assertQueryInvalid(null, "let s : String = invalid in 'test' > s");
ocl.assertQueryInvalid(null, "let s1 : String = invalid, s2 : String = invalid in s1 > s2");
// null
ocl.assertQueryInvalid(null, "let s : String = null in s > 'se'");
ocl.assertQueryInvalid(null, "let s : String = null in 'test' > s");
ocl.assertQueryInvalid(null, "let s1 : String = null, s2 : String = null in s1 > s2");
ocl.dispose();
}
@Test public void testStringGreaterThanOrEqual() {
TestOCL ocl = createOCL();
// FIXME Analyzer-extraOperation String::>= should not be defined
ocl.assertQueryFalse(null, "'3' >= '4'");
ocl.assertQueryFalse(null, "'a' >= 'b'");
ocl.assertQueryFalse(null, "'aardvark' >= 'aardvarks'");
ocl.assertQueryTrue(null, "'3.2' >= '3.1'");
ocl.assertQueryTrue(null, "'a' >= 'A'");
ocl.assertQueryTrue(null, "'aardvark' >= 'aardvarK'");
ocl.assertQueryTrue(null, "'3' >= '3'");
ocl.assertQueryTrue(null, "'a' >= 'a'");
ocl.assertQueryTrue(null, "'aardvark' >= 'aardvark'");
// invalid
ocl.assertQueryInvalid(null, "let s : String = invalid in s >= 'se'");
ocl.assertQueryInvalid(null, "let s : String = invalid in 'test' >= s");
ocl.assertQueryInvalid(null, "let s1 : String = invalid, s2 : String = invalid in s1 >= s2");
// null
ocl.assertQueryInvalid(null, "let s : String = null in s >= 'se'");
ocl.assertQueryInvalid(null, "let s : String = null in 'test' >= s");
ocl.assertQueryInvalid(null, "let s1 : String = null, s2 : String = null in s1 >= s2");
ocl.dispose();
}
@Test public void testStringIndexOf() {
TestOCL ocl = createOCL();
ocl.assertQueryEquals(null, 1, "'test'.indexOf('t')");
ocl.assertQueryEquals(null, 1, "'test'.indexOf('te')");
ocl.assertQueryEquals(null, 2, "'test'.indexOf('es')");
ocl.assertQueryEquals(null, 3, "'test'.indexOf('st')");
ocl.assertQueryEquals(null, 5, "'tesla'.indexOf('a')");
// out of bounds
ocl.assertQueryEquals(null, 0, "'test'.indexOf('xyzzy')");
ocl.assertQueryEquals(null, 0, "'test'.indexOf('est2')");
// empty
ocl.assertQueryEquals(null, 1, "'test'.indexOf('')");
ocl.assertQueryEquals(null, 1, "''.indexOf('')");
ocl.assertQueryEquals(null, 0, "''.indexOf('t')");
// invalid
ocl.assertQueryInvalid(null, "let s : String = invalid in 'test'.indexOf(s)");
ocl.assertQueryInvalid(null, "let s : String = invalid in s.indexOf('s')");
// null
ocl.assertQueryInvalid(null, "let s : String = null in 'test'.indexOf(s)");
ocl.assertQueryInvalid(null, "let s : String = null in s.indexOf('s')");
ocl.dispose();
}
@Test public void testStringLastIndexOf() {
TestOCL ocl = createOCL();
ocl.assertQueryEquals(null, 4, "'test'.lastIndexOf('t')");
ocl.assertQueryEquals(null, 1, "'test'.lastIndexOf('te')");
ocl.assertQueryEquals(null, 2, "'test'.lastIndexOf('es')");
ocl.assertQueryEquals(null, 3, "'test'.lastIndexOf('st')");
ocl.assertQueryEquals(null, 5, "'tesla'.lastIndexOf('a')");
ocl.assertQueryEquals(null, 1, "'ates'.lastIndexOf('a')");
// out of bounds
ocl.assertQueryEquals(null, 0, "'test'.lastIndexOf('xyzzy')");
ocl.assertQueryEquals(null, 0, "'test'.lastIndexOf('est2')");
// empty
ocl.assertQueryEquals(null, 5, "'test'.lastIndexOf('')");
ocl.assertQueryEquals(null, 1, "''.lastIndexOf('')");
ocl.assertQueryEquals(null, 0, "''.lastIndexOf('t')");
// invalid
ocl.assertQueryInvalid(null, "let s : String = invalid in 'test'.lastIndexOf(s)");
ocl.assertQueryInvalid(null, "let s : String = invalid in s.lastIndexOf('s')");
// null
ocl.assertQueryInvalid(null, "let s : String = null in 'test'.lastIndexOf(s)");
ocl.assertQueryInvalid(null, "let s : String = null in s.lastIndexOf('s')");
ocl.dispose();
}
@Test public void testStringLessThan() {
TestOCL ocl = createOCL();
// FIXME Analyzer-extraOperation String::< should not be defined
ocl.assertQueryTrue(null, "'3' < '4'");
ocl.assertQueryTrue(null, "'a' < 'b'");
ocl.assertQueryTrue(null, "'aardvark' < 'aardvarks'");
ocl.assertQueryFalse(null, "'3.2' < '3.1'");
ocl.assertQueryFalse(null, "'a' < 'A'");
ocl.assertQueryFalse(null, "'aardvark' < 'aardvarK'");
ocl.assertQueryFalse(null, "'3' < '3'");
ocl.assertQueryFalse(null, "'a' < 'a'");
ocl.assertQueryFalse(null, "'aardvark' < 'aardvark'");
// invalid
ocl.assertQueryInvalid(null, "let s : String = invalid in s < 'se'");
ocl.assertQueryInvalid(null, "let s : String = invalid in 'test' < s");
ocl.assertQueryInvalid(null, "let s1 : String = invalid, s2 : String = invalid in s1 < s2");
// null
ocl.assertQueryInvalid(null, "let s : String = null in s < 'se'");
ocl.assertQueryInvalid(null, "let s : String = null in 'test' < s");
ocl.assertQueryInvalid(null, "let s1 : String = null, s2 : String = null in s1 < s2");
ocl.dispose();
}
@Test public void testStringLessThanOrEqual() {
TestOCL ocl = createOCL();
// FIXME Analyzer-extraOperation String::<= should not be defined
ocl.assertQueryTrue(null, "'3' <= '4'");
ocl.assertQueryTrue(null, "'a' <= 'b'");
ocl.assertQueryTrue(null, "'aardvark' <= 'aardvarks'");
ocl.assertQueryFalse(null, "'3.2' <= '3.1'");
ocl.assertQueryFalse(null, "'a' <= 'A'");
ocl.assertQueryFalse(null, "'aardvark' <= 'aardvarK'");
ocl.assertQueryTrue(null, "'3' <= '3'");
ocl.assertQueryTrue(null, "'a' <= 'a'");
ocl.assertQueryTrue(null, "'aardvark' <= 'aardvark'");
// invalid
ocl.assertQueryInvalid(null, "let s : String = invalid in s <= 'se'");
ocl.assertQueryInvalid(null, "let s : String = invalid in 'test' <= s");
ocl.assertQueryInvalid(null, "let s1 : String = invalid, s2 : String = invalid in s1 <= s2");
// null
ocl.assertQueryInvalid(null, "let s : String = null in s <= 'se'");
ocl.assertQueryInvalid(null, "let s : String = null in 'test' <= s");
ocl.assertQueryInvalid(null, "let s1 : String = null, s2 : String = null in s1 <= s2");
ocl.dispose();
}
@Test public void testStringMatches() {
TestOCL ocl = createOCL();
ocl.assertQueryTrue(null, "'characters and spaces'.matches('[\\\\w\\\\s]+')"); // *2 for Java, *2 for OCL
ocl.assertQueryFalse(null, "'characters and 3 digits'.matches('[\\\\p{Alpha}\\\\s]+')");
//
ocl.assertQueryTrue(null, "''.matches('')");
ocl.assertQueryTrue(null, "''.matches('')");
ocl.assertQueryFalse(null, "'a'.matches('')");
ocl.assertQueryFalse(null, "''.matches('b')");
//
ocl.assertQueryInvalid(null, "'repla ce operation'.matches('a[b-')", null, PatternSyntaxException.class);
//
ocl.assertQueryInvalid(null, "let s : String = null in s.matches('(\\\\w+)\\\\s*')");
ocl.assertQueryInvalid(null, "'repla ce operation'.matches(null)");
//
ocl.assertQueryInvalid(null, "let s : String = invalid in s.matches('(\\\\w+)\\\\s*')");
ocl.assertQueryInvalid(null, "'repla ce operation'.matches(invalid)");
// -- visual inspection of println's demonstrates cache re-use; this test just conforms cache still ok once full
ocl.assertQueryEquals(null, 50, "let seq = Sequence{1..20}, rseq = seq->reverse(), seqs = Sequence{seq,rseq,seq,rseq,seq}->flatten() in seqs->iterate(i; acc : Integer = 0 | if '123456789'.matches('.*' + i.toString() + '.*') then acc + 1 else acc endif)");
ocl.dispose();
}
@Test public void testStringNotEqual() {
TestOCL ocl = createOCL();
ocl.assertQueryTrue(null, "'test' <> 'se'");
ocl.assertQueryFalse(null, "'test' <> 'test'");
// invalid
ocl.assertQueryInvalid(null, "let s : String = invalid in s <> 'se'");
ocl.assertQueryInvalid(null, "let s : String = invalid in 'test' <> s");
ocl.assertQueryInvalid(null, "let s1 : String = invalid, s2 : String = invalid in s1 <> s2");
// null
ocl.assertQueryTrue(null, "let s : String = null in s <> 'se'");
ocl.assertQueryTrue(null, "let s : String = null in 'test' <> s");
ocl.assertQueryFalse(null, "let s1 : String = null, s2 : String = null in s1 <> s2");
ocl.dispose();
}
@Test public void testStringOclAsType() {
TestOCL ocl = createOCL();
ocl.assertQueryInvalid(null, "'test'.oclAsType(Integer)");
ocl.assertQueryEquals(null, "test", "'test'.oclAsType(String)");
ocl.assertQueryEquals(null, "test", "'test'.oclAsType(OclAny)");
ocl.assertQueryInvalid(null, "'test'.oclAsType(OclVoid)");
ocl.assertQueryInvalid(null, "'test'.oclAsType(OclInvalid)");
ocl.dispose();
}
@Test public void testStringOclIsInvalid() {
TestOCL ocl = createOCL();
ocl.assertQueryFalse(null, "'test'.oclIsInvalid()");
ocl.assertQueryFalse(null, "''.oclIsInvalid()");
ocl.dispose();
}
@Test public void testStringOclIsKindOf() {
TestOCL ocl = createOCL();
ocl.assertQueryFalse(null, "'test'.oclIsKindOf(Integer)");
ocl.assertQueryTrue(null, "'test'.oclIsKindOf(String)");
ocl.assertQueryTrue(null, "'test'.oclIsKindOf(OclAny)");
ocl.assertQueryFalse(null, "'test'.oclIsKindOf(OclVoid)");
ocl.assertQueryFalse(null, "'test'.oclIsKindOf(OclInvalid)");
ocl.dispose();
}
@Test public void testStringOclIsTypeOf() {
TestOCL ocl = createOCL();
ocl.assertQueryFalse(null, "'test'.oclIsTypeOf(Integer)");
ocl.assertQueryTrue(null, "'test'.oclIsTypeOf(String)");
ocl.assertQueryFalse(null, "'test'.oclIsTypeOf(OclAny)");
ocl.assertQueryFalse(null, "'test'.oclIsTypeOf(OclVoid)");
ocl.assertQueryFalse(null, "'test'.oclIsTypeOf(OclInvalid)");
ocl.dispose();
}
@Test public void testStringOclIsUndefined() {
TestOCL ocl = createOCL();
ocl.assertQueryFalse(null, "'test'.oclIsUndefined()");
ocl.assertQueryFalse(null, "''.oclIsUndefined()");
ocl.dispose();
}
@Test public void testStringPlus() {
TestOCL ocl = createOCL();
ocl.assertQueryEquals(null, "concatenationTest", "'concatenation' + 'Test'");
ocl.assertQueryEquals(null, "concatenation\n", "'concatenation' + '\\n'");
// invalid
ocl.assertQueryInvalid(null, "let s : String = invalid in 'concatenation' + s");
ocl.assertQueryInvalid(null, "let s : String = invalid in s + 'concatenation'");
// null
ocl.assertQueryInvalid(null, "let s : String = null in 'concatenation' + s");
ocl.assertQueryInvalid(null, "let s : String = null in s + 'concatenation'");
ocl.dispose();
}
@Test public void testStringReplaceAll() {
TestOCL ocl = createOCL();
ocl.assertQueryEquals(null, "rePlaceAll oPeration", "'replaceAll operation'.replaceAll('p', 'P')");
ocl.assertQueryEquals(null, "ReplaceAllOperation", "'Repla ce All Operation'.replaceAll('(\\\\w+)\\\\s*', '$1')");
//
ocl.assertQueryEquals(null, "xx", "''.replaceAll('', 'xx')");
ocl.assertQueryEquals(null, "xxrxxexxpxxlxxaxx xxcxxexx xxoxxpxxexxrxxaxxtxxixxoxxnxx", "'repla ce operation'.replaceAll('', 'xx')");
ocl.assertQueryEquals(null, "", "'repla ce operation'.replaceAll('(\\\\w+)\\\\s*', '')");
ocl.assertQueryEquals(null, "repla ce operation", "'repla ce operation'.replaceAll('', '')");
//
ocl.assertQueryInvalid(null, "'repla ce operation'.replaceAll('a[b-', '$1')", null, PatternSyntaxException.class);
ocl.assertQueryInvalid(null, "'repla ce operation'.replaceAll('', '$1')", "No group 1", IndexOutOfBoundsException.class);
//
ocl.assertQueryInvalid(null, "let s : String = null in s.replaceAll('(\\\\w+)\\\\s*', '$1')");
ocl.assertQueryInvalid(null, "'repla ce operation'.replaceAll(null, '$1')");
ocl.assertQueryInvalid(null, "'repla ce operation'.replaceAll('(\\\\w+)\\\\s*', null)");
//
ocl.assertQueryInvalid(null, "let s : String = invalid in s.replaceAll('(\\\\w+)\\\\s*', '$1')");
ocl.assertQueryInvalid(null, "'repla ce operation'.replaceAll(invalid, '$1')");
ocl.assertQueryInvalid(null, "'repla ce operation'.replaceAll('(\\\\w+)\\\\s*', invalid)");
ocl.dispose();
}
@Test public void testStringReplaceFirst() {
TestOCL ocl = createOCL();
ocl.assertQueryEquals(null, "rePlace operation", "'replace operation'.replaceFirst('p', 'P')");
ocl.assertQueryEquals(null, "replace operation", "'repla ce operation'.replaceFirst('(\\\\w+)\\\\s*', '$1')");
//
ocl.assertQueryEquals(null, "xx", "''.replaceFirst('', 'xx')");
ocl.assertQueryEquals(null, "xxrepla ce operation", "'repla ce operation'.replaceFirst('', 'xx')");
ocl.assertQueryEquals(null, "ce operation", "'repla ce operation'.replaceFirst('(\\\\w+)\\\\s*', '')");
ocl.assertQueryEquals(null, "repla ce operation", "'repla ce operation'.replaceFirst('', '')");
//
ocl.assertQueryInvalid(null, "'repla ce operation'.replaceFirst('a[b-', '$1')", null, PatternSyntaxException.class);
ocl.assertQueryInvalid(null, "'repla ce operation'.replaceFirst('', '$1')", "No group 1", IndexOutOfBoundsException.class);
//
ocl.assertQueryInvalid(null, "let s : String = null in s.replaceFirst('(\\\\w+)\\\\s*', '$1')");
ocl.assertQueryInvalid(null, "'repla ce operation'.replaceFirst(null, '$1')");
ocl.assertQueryInvalid(null, "'repla ce operation'.replaceFirst('(\\\\w+)\\\\s*', null)");
//
ocl.assertQueryInvalid(null, "let s : String = invalid in s.replaceFirst('(\\\\w+)\\\\s*', '$1')");
ocl.assertQueryInvalid(null, "'repla ce operation'.replaceFirst(invalid, '$1')");
ocl.assertQueryInvalid(null, "'repla ce operation'.replaceFirst('(\\\\w+)\\\\s*', invalid)");
ocl.dispose();
}
@Test public void testStringSize() {
TestOCL ocl = createOCL();
ocl.assertQueryEquals(null, Integer.valueOf(4), "'test'.size()");
ocl.assertQueryEquals(null, Integer.valueOf(0), "''.size()");
// invalid
ocl.assertQueryInvalid(null, "let s : String = invalid in s.size()");
// null
ocl.assertQueryInvalid(null, "let s : String = null in s.size()");
ocl.dispose();
}
@Test public void testStringStartsWith() {
TestOCL ocl = createOCL();
ocl.assertQueryFalse(null, "'abcdef'.startsWith('abcdefg')");
ocl.assertQueryTrue(null, "'abcdef'.startsWith('abcdef')");
ocl.assertQueryTrue(null, "'abcdef'.startsWith('abcd')");
ocl.assertQueryTrue(null, "'abcdef'.startsWith('a')");
ocl.assertQueryTrue(null, "'abcdef'.startsWith('')");
ocl.assertQueryTrue(null, "''.startsWith('')");
ocl.assertQueryFalse(null, "''.startsWith('a')");
ocl.assertQueryTrue(null, "'abcdef'.startsWith('')");
ocl.assertQueryFalse(null, "'abcdef'.startsWith('bcd')");
ocl.assertQueryFalse(null, "'abcdef'.startsWith('ef')");
ocl.assertQueryFalse(null, "'abcdef'.startsWith('f')");
// invalid
ocl.assertQueryInvalid(null, "let s : String = invalid in s.startsWith('')");
ocl.assertQueryInvalid(null, "let s : String = invalid in ''.startsWith(s)");
// null
ocl.assertQueryInvalid(null, "let s : String = null in s.startsWith('')");
ocl.assertQueryInvalid(null, "let s : String = null in ''.startsWith(s)");
ocl.dispose();
}
@Test public void testStringSubstituteAll() {
TestOCL ocl = createOCL();
ocl.assertQueryEquals(null, "subsTiTuTeAll operaTion", "'substituteAll operation'.substituteAll('t', 'T')");
//
ocl.assertQueryEquals(null, "xx", "''.replaceAll('', 'xx')");
ocl.assertQueryEquals(null, "xxrxxexxpxxlxxaxx xxcxxexx xxoxxpxxexxrxxaxxtxxixxoxxnxx", "'repla ce operation'.substituteAll('', 'xx')");
ocl.assertQueryEquals(null, "repla ce operation", "'repla ce operation'.substituteAll('(\\\\w+)\\\\s*', '')");
ocl.assertQueryEquals(null, "repla ce operation", "'repla ce operation'.substituteAll('', '')");
//
ocl.assertQueryInvalid(null, "let s : String = null in s.substituteAll('(\\\\w+)\\\\s*', '$1')");
ocl.assertQueryInvalid(null, "'repla ce operation'.substituteAll(null, '$1')");
ocl.assertQueryInvalid(null, "'repla ce operation'.substituteAll('(\\\\w+)\\\\s*', null)");
//
ocl.assertQueryInvalid(null, "let s : String = invalid in s.substituteAll('(\\\\w+)\\\\s*', '$1')");
ocl.assertQueryInvalid(null, "'repla ce operation'.substituteAll(invalid, '$1')");
ocl.assertQueryInvalid(null, "'repla ce operation'.substituteAll('(\\\\w+)\\\\s*', invalid)");
ocl.dispose();
}
@Test public void testStringSubstituteFirst() {
TestOCL ocl = createOCL();
ocl.assertQueryEquals(null, "subsTiTuTeFirst operaTion", "'substiTuTeFirst operaTion'.substituteFirst('t', 'T')");
ocl.assertQueryEquals(null, "SubstiTuTeFirst operaTion", "'substiTuTeFirst operaTion'.substituteFirst('s', 'S')");
ocl.assertQueryEquals(null, "substiTuTeFirst operaTioN", "'substiTuTeFirst operaTion'.substituteFirst('n', 'N')");
ocl.assertQueryEquals(null, "substiTuTeFirst operaTion", "'substiTuTeFirst operaTion'.substituteFirst('n', 'n')");
ocl.assertQueryEquals(null, "substiTuTeFirst operaTiON", "'substiTuTeFirst operaTion'.substituteFirst('on', 'ON')");
ocl.assertQueryEquals(null, "a[b-c]d\r\n*", "'a[b-c]d\\\\w*'.substituteFirst('\\\\w', '\r\n')");
//
ocl.assertQueryEquals(null, "xx", "''.substituteFirst('', 'xx')");
ocl.assertQueryEquals(null, "xxrepla ce operation", "'repla ce operation'.substituteFirst('', 'xx')");
ocl.assertQueryEquals(null, "repla ce operation", "'repla ce operation'.substituteFirst('', '')");
//
ocl.assertQueryInvalid(null, "'repla ce operation'.substituteFirst('(\\\\w+)\\\\s*', '')",
StringUtil.bind(PivotMessages.MissingSubstring, "(\\w+)\\s*", "repla ce operation"), null);
//
ocl.assertQueryInvalid(null, "let s : String = null in s.substituteFirst('(\\\\w+)\\\\s*', '$1')");
ocl.assertQueryInvalid(null, "'repla ce operation'.substituteFirst(null, '$1')");
ocl.assertQueryInvalid(null, "'repla ce operation'.substituteFirst('(\\\\w+)\\\\s*', null)");
//
ocl.assertQueryInvalid(null, "let s : String = invalid in s.substituteFirst('(\\\\w+)\\\\s*', '$1')");
ocl.assertQueryInvalid(null, "'repla ce operation'.substituteFirst(invalid, '$1')");
ocl.assertQueryInvalid(null, "'repla ce operation'.substituteFirst('(\\\\w+)\\\\s*', invalid)");
ocl.dispose();
}
@Test public void testStringSubstring() {
TestOCL ocl = createOCL();
ocl.assertQueryEquals(null, "t", "'test'.substring(1, 1)");
ocl.assertQueryEquals(null, "es", "'test'.substring(2, 3)");
ocl.assertQueryEquals(null, "t", "'test'.substring(4, 4)");
// illegal
ocl.assertQueryInvalid(null, "'test'.substring(2, 1)");
ocl.assertQueryInvalid(null, "'test'.substring(3, 1)");
// out of bounds
ocl.assertQueryInvalid(null, "'test'.substring(0, 1)");
ocl.assertQueryInvalid(null, "'test'.substring(4, 5)");
// invalid
ocl.assertQueryInvalid(null, "let s : String = invalid in s.substring(1, 1)");
ocl.assertQueryInvalid(null, "let s : String = invalid in s.substring(5, 5)");
// null
ocl.assertQueryInvalid(null, "let s : String = null in s.substring(1, 1)");
ocl.assertQueryInvalid(null, "let s : String = null in s.substring(5, 5)");
ocl.dispose();
}
@Test public void testStringToBoolean() {
TestOCL ocl = createOCL();
ocl.assertQueryTrue(null, "'true'.toBoolean()");
ocl.assertQueryFalse(null, "' true'.toBoolean()");
ocl.assertQueryFalse(null, "'true '.toBoolean()");
ocl.assertQueryFalse(null, "'True'.toBoolean()");
ocl.assertQueryFalse(null, "'false'.toBoolean()");
ocl.assertQueryFalse(null, "'-4'.toBoolean()");
// invalid
ocl.assertQueryInvalid(null, "let s : String = invalid in s.toBoolean()");
// null
ocl.assertQueryInvalid(null, "let s : String = null in s.toBoolean()");
ocl.dispose();
}
@Test public void testStringToInteger() {
TestOCL ocl = createOCL();
ocl.assertQueryEquals(null, Integer.valueOf(4), "'4'.toInteger()");
ocl.assertQueryEquals(null, Integer.valueOf(-4), "'-4'.toInteger()");
ocl.assertQueryInvalid(null, "'4.0'.toInteger()", NLS.bind(PivotMessages.InvalidInteger, "4.0"), NumberFormatException.class);
ocl.assertQueryInvalid(null, "'2.4.0'.toInteger()");
ocl.assertQueryInvalid(null, "'a'.toInteger()");
// invalid
ocl.assertQueryInvalid(null, "let s : String = invalid in s.toInteger()");
// null
ocl.assertQueryInvalid(null, "let s : String = null in s.toInteger()");
ocl.dispose();
}
@Test public void testStringToLowerCase() {
TestOCL ocl = createOCL();
// checkForUTF8Encoding()
ocl.assertQueryEquals(null, "4", "'4'.toLowerCase()"); //$NON-NLS-2$
ocl.assertQueryEquals(null, "mixed", "'MiXeD'.toLowerCase()"); //$NON-NLS-2$
ocl.assertQueryEquals(null, "upper", "'UPPER'.toLowerCase()"); //$NON-NLS-2$
// Ensures word-final sigma and regular sigmas are converted as needed
// TODO re-enable once the Unicode problems on Hudson have been resolved
// ocl.assertQueryEquals(null, "ὀδυσσεύς", "'ὈΔΥΣΣΕΎΣ'.toLowerCase()");
// invalid
ocl.assertQueryInvalid(null, "let s : String = invalid in s.toLowerCase()");
// null
ocl.assertQueryInvalid(null, "let s : String = null in s.toLowerCase()");
ocl.dispose();
}
@Test public void testStringToReal() {
TestOCL ocl = createOCL();
ocl.assertQueryEquals(null, 4.0, "'4'.toReal()", 0.0);
ocl.assertQueryEquals(null, -4.0, "'-4'.toReal()", 0.0);
ocl.assertQueryEquals(null, 4.0, "'4.0'.toReal()", 0.0);
ocl.assertQueryInvalid(null, "'2.4.0'.toReal()", NLS.bind(PivotMessages.InvalidReal, "2.4.0"), NumberFormatException.class);
ocl.assertQueryInvalid(null, "'a'.toReal()", NLS.bind(PivotMessages.InvalidReal, "a"), NumberFormatException.class);
// invalid
ocl.assertQueryInvalid(null, "let s : String = invalid in s.toReal()");
// null
ocl.assertQueryInvalid(null, "let s : String = null in s.toReal()");
ocl.dispose();
}
@Test public void testStringToString() {
TestOCL ocl = createOCL();
ocl.assertQueryEquals(null, "4.0", "'4.0'.toString()");
ocl.assertQueryEquals(null, "4.0\t4", "('4.0' + '\t' + '4').toString()");
ocl.dispose();
}
@Test public void testStringToUpperCase() {
TestOCL ocl = createOCL();
// checkForUTF8Encoding();
ocl.assertQueryEquals(null, "4", "'4'.toUpperCase()");
ocl.assertQueryEquals(null, "MIXED", "'MiXeD'.toUpperCase()");
ocl.assertQueryEquals(null, "LOWER", "'lower'.toUpperCase()");
// Ensures word-final sigma and regular sigmas are converted as needed
// TODO re-enable once the Unicode problems on Hudson have been resolved
// ocl.assertQueryEquals(null, "ὈΔΥΣΣΕΎΣ", "'ὀδυσσεύς'.toUpperCase()");
// Sharp s should be mapped to a double S upper case
// TODO re-enable once the Unicode problems on Hudson have been resolved
// ocl.assertQueryEquals(null, "SS", "'ß'.toUpperCase()");
// invalid
ocl.assertQueryInvalid(null, "let s : String = invalid in s.toUpperCase()");
// null
ocl.assertQueryInvalid(null, "let s : String = null in s.toUpperCase()");
ocl.dispose();
}
@Test public void testStringTokenize() {
TestOCL ocl = createOCL();
ocl.assertQueryResults(null, "Sequence{'a','b','c','d'}", "'\na b\tc\fd\r'.tokenize()");
ocl.assertQueryResults(null, "Sequence{'a','b','c','d'}", "' \t\n\r\fa b\tc\fd \t\n\r\f'.tokenize()");
ocl.assertQueryResults(null, "Sequence{' ','\t','\n','\r','\f','a',' ','b','\t','c','\f','d',' ','\t','\n','\r','\f'}", "' \t\n\r\fa b\tc\fd \t\n\r\f'.tokenize(' \t\n\r\f', true)");
ocl.assertQueryResults(null, "Sequence{'\na',' ', 'b\tc\fd\r'}", "'\na b\tc\fd\r'.tokenize(' ', true)");
ocl.assertQueryResults(null, "Sequence{'\na','b\tc\fd\r'}", "'\na b\tc\fd\r'.tokenize(' ')");
ocl.assertQueryResults(null, "Sequence{'1','2','3','4'}", "'1.2.3.4'.tokenize('.')"); // BUG 422296
ocl.assertQueryResults(null, "Sequence{}", "''.tokenize(' ', true)");
ocl.assertQueryResults(null, "Sequence{' \t\n\r\f'}", "' \t\n\r\f'.tokenize('', true)");
ocl.assertQueryResults(null, "Sequence{}", "''.tokenize('', true)");
ocl.assertQueryResults(null, "Sequence{}", "''.tokenize(' \t\n\r\f', true)");
// invalid
ocl.assertQueryInvalid(null, "let s : String = invalid in s.tokenize()");
ocl.assertQueryInvalid(null, "let s : String = invalid in s.tokenize('')");
ocl.assertQueryInvalid(null, "let s : String = invalid in s.tokenize('',true)");
ocl.assertQueryInvalid(null, "let s : String = invalid in ''.tokenize(s)");
ocl.assertQueryInvalid(null, "let s : String = invalid in ''.tokenize(s,true)");
ocl.assertQueryInvalid(null, "let b : Boolean = invalid in ''.tokenize('',b)");
// null
ocl.assertQueryInvalid(null, "let s : String = null in s.tokenize()");
ocl.assertQueryInvalid(null, "let s : String = null in s.tokenize('')");
ocl.assertQueryInvalid(null, "let s : String = null in s.tokenize('',true)");
ocl.assertQueryInvalid(null, "let s : String = null in ''.tokenize(s)");
ocl.assertQueryInvalid(null, "let s : String = null in ''.tokenize(s,true)");
ocl.assertQueryInvalid(null, "let b : Boolean = null in ''.tokenize('',b)");
// cached
ocl.assertQueryTrue(null, "'1.2.3.4'.tokenize('.')='1.2.3.4'.tokenize('.')");
ocl.assertSemanticErrorQuery(null, "''.tokenize('',false,null)", PivotMessagesInternal.UnresolvedOperationCall_ERROR_, "String", "tokenize", "'',false,null");
ocl.dispose();
}
@Test public void testStringTrim() {
TestOCL ocl = createOCL();
ocl.assertQueryEquals(null, "ab", "'ab'.trim()");
ocl.assertQueryEquals(null, "a", "'a'.trim()");
ocl.assertQueryEquals(null, "", "''.trim()");
ocl.assertQueryEquals(null, "a \t\n\r\fb", "'\na \t\n\r\fb\n'.trim()");
ocl.assertQueryEquals(null, "", "' \t\n\r\f \t\n\r\f'.trim()");
// invalid
ocl.assertQueryInvalid(null, "let s : String = invalid in s.trim()");
// null
ocl.assertQueryInvalid(null, "let s : String = null in s.trim()");
ocl.dispose();
}
}