You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@uima.apache.org by sc...@apache.org on 2016/05/06 22:19:50 UTC

svn commit: r1742662 - /uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/test/java/org/apache/uima/cas/test/FeatureStructureTest.java

Author: schor
Date: Fri May  6 22:19:50 2016
New Revision: 1742662

URL: http://svn.apache.org/viewvc?rev=1742662&view=rev
Log:
[UIMA-4674] add test for v2 backward compatibility with ll set-int and friends.

Modified:
    uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/test/java/org/apache/uima/cas/test/FeatureStructureTest.java

Modified: uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/test/java/org/apache/uima/cas/test/FeatureStructureTest.java
URL: http://svn.apache.org/viewvc/uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/test/java/org/apache/uima/cas/test/FeatureStructureTest.java?rev=1742662&r1=1742661&r2=1742662&view=diff
==============================================================================
--- uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/test/java/org/apache/uima/cas/test/FeatureStructureTest.java (original)
+++ uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/test/java/org/apache/uima/cas/test/FeatureStructureTest.java Fri May  6 22:19:50 2016
@@ -25,10 +25,19 @@ import org.apache.uima.cas.CASRuntimeExc
 import org.apache.uima.cas.Feature;
 import org.apache.uima.cas.FeatureStructure;
 import org.apache.uima.cas.Type;
-import org.apache.uima.cas.TypeSystem;
+import org.apache.uima.cas.impl.CASImpl;
+import org.apache.uima.cas.impl.FeatureImpl;
 import org.apache.uima.cas.impl.LowLevelCAS;
 import org.apache.uima.cas.impl.LowLevelTypeSystem;
+import org.apache.uima.cas.impl.TypeImpl;
+import org.apache.uima.cas.impl.TypeSystemConstants;
+import org.apache.uima.cas.impl.TypeSystemImpl;
 import org.apache.uima.cas.text.AnnotationFS;
+import org.apache.uima.jcas.cas.FSArray;
+import org.apache.uima.jcas.cas.NonEmptyFSList;
+import org.apache.uima.jcas.cas.Sofa;
+import org.apache.uima.jcas.cas.TOP;
+import org.apache.uima.jcas.tcas.Annotation;
 
 import junit.framework.TestCase;
 
@@ -38,19 +47,19 @@ import junit.framework.TestCase;
  */
 public class FeatureStructureTest extends TestCase {
 
-	private CAS cas;
+	private CASImpl cas;
 
-	private TypeSystem ts;
+	private TypeSystemImpl ts;
 
 	private Type topType;
 
 	private Type stringType;
 
-	private Type tokenType;
+	private TypeImpl tokenType;
 
 	private Type intType;
 
-	private Type tokenTypeType;
+	private TypeImpl tokenTypeType;
 
 	private Type wordType;
 
@@ -79,6 +88,8 @@ public class FeatureStructureTest extend
 	private Feature sentLenFeat;
 
 	private Feature tokenFloatFeat;
+	private Feature tokenLongFeat;
+	private Feature tokenDoubleFeat;
 
 	private Feature startFeature;
 
@@ -97,9 +108,9 @@ public class FeatureStructureTest extend
 
 	public void setUp() {
 		try {
-			this.cas = CASInitializer.initCas(new CASTestSetup(), null);
+			this.cas = (CASImpl) CASInitializer.initCas(new CASTestSetup(), null);
 			assertTrue(this.cas != null);
-			this.ts = this.cas.getTypeSystem();
+			this.ts = (TypeSystemImpl) this.cas.getTypeSystem();
 			assertTrue(this.ts != null);
 		} catch (Exception e) {
 			e.printStackTrace();
@@ -133,6 +144,10 @@ public class FeatureStructureTest extend
 		assertTrue(this.sentLenFeat != null);
 		this.tokenFloatFeat = this.ts.getFeatureByFullName(CASTestSetup.TOKEN_FLOAT_FEAT_Q);
 		assertTrue(this.tokenFloatFeat != null);
+    this.tokenDoubleFeat = this.ts.getFeatureByFullName(CASTestSetup.TOKEN_DOUBLE_FEAT_Q);
+    assertTrue(this.tokenDoubleFeat != null);
+    this.tokenLongFeat = this.ts.getFeatureByFullName(CASTestSetup.TOKEN_LONG_FEAT_Q);
+    assertTrue(this.tokenLongFeat != null);
 		this.startFeature = this.ts.getFeatureByFullName(CAS.FEATURE_FULL_NAME_BEGIN);
 		assertTrue(this.startFeature != null);
 		this.langPairType = this.ts.getType(CASTestSetup.LANG_PAIR);
@@ -200,6 +215,92 @@ public class FeatureStructureTest extend
 		assertTrue(word.getType().equals(wordType1));
 		assertTrue(token.getType().equals(tokenType1));
 	}
+	
+	/**
+	 * This test tests V2 backwards compatibility 
+	 * The goal is to match what V2 did for low level cas access
+	 * The area this is testing is the use of the LL int operations to change the type of an existing feature structure.
+	 */
+	public void testLLsetType() {
+	  LowLevelCAS llc = cas.getLowLevelCAS();
+    FSArray fsa = new FSArray(ts.getType(CAS.TYPE_NAME_FS_ARRAY), cas, 3);
+    NonEmptyFSList  fsl = new NonEmptyFSList(ts.getType(CAS.TYPE_NAME_NON_EMPTY_FS_LIST), cas);
+    
+    Annotation token = this.cas.createFS(tokenType);
+    // set up some refs; these must be updated if the type changes in a way to require a new FS
+    fsa.set(0, token);   // set the 0th  element of a FS Array to point to the "token"
+    fsl.setHead(token);  // set the head element of a FS Array to point to the "token"
+    int tokId = token.id();
+    
+    // set some feature values; some of these are copied (if there's room, etc.)
+    TOP ttfv = cas.createFS(tokenTypeType);
+    token.setFeatureValue(tokenTypeFeat, ttfv);
+    token.setFloatValue(tokenFloatFeat, 1.1f);
+    assertEquals(1.1f, token.getFloatValue(tokenFloatFeat));
+    token.setDoubleValue(tokenDoubleFeat, 1.7d);
+    assertEquals(1.7d, token.getDoubleValue(tokenDoubleFeat));
+    token.setBegin(3);
+    token.setEnd(5);
+    
+    Sofa sofa = (Sofa) token.getSofa();
+    assertTrue(sofa != null);
+    assertTrue(fsa.get(0) == token);
+    assertTrue(fsl.getHead() == token);
+    
+    // change the type to just Annotation
+    // because this is a supertype, it should not create a new FS
+    
+    llc.ll_setIntValue(tokId, 0, TypeSystemConstants.annotTypeCode);
+    Annotation fs = cas.getFsFromId(tokId);
+    assertTrue(fs == token);
+    assertTrue(fs.id() == token.id());
+    assertEquals(ts.annotType, fs._typeImpl);
+    assertEquals(fs.getBegin(), 3);
+    assertEquals(fs.getEnd(), 5);
+    assertEquals(sofa, fs.getSofa());
+    assertTrue(fsa.get(0) == fs);
+    assertTrue(fsl.getHead() == fs);
+    
+    // Change Annotation back to Token type    
+    
+    llc.ll_setIntValue(tokId, 0, tokenType.getCode());
+    token = cas.getFsFromId(tokId);
+    assertTrue(fs == token);
+    assertTrue(fs.id() == token.id());
+    assertEquals(fs.getBegin(), 3);
+    assertEquals(fs.getEnd(), 5);
+    assertEquals(sofa, fs.getSofa());
+    assertEquals(1.1f, token.getFloatValue(tokenFloatFeat));
+    assertEquals(ttfv, token.getFeatureValue(tokenTypeFeat));
+    assertTrue(fsa.get(0) == token);
+    assertTrue(fsl.getHead() == token);
+    
+    // change type where the type forces a copy
+    // token -> token_type_type
+    //  These types are completely orthogonal, one doesn't subsume the other
+    
+    llc.ll_setIntValue(tokId,  0,  tokenTypeType.getCode());
+    TOP ttt = cas.getFsFromId(tokId);
+    assertTrue(ttt != token);
+    assertTrue(ttt.id() == tokId);
+    assertEquals(ttt._typeImpl, tokenTypeType);
+    assertTrue(fsa.get(0) == ttt);
+    assertTrue(fsl.getHead() == ttt);
+    
+    
+    llc.ll_setIntValue(tokId,  0,  tokenType.getCode());
+    token = cas.getFsFromId(tokId);
+    assertTrue(ttt != token);
+    assertTrue(ttt.id() == token.id());
+    assertEquals(token.getBegin(), 0);
+    assertEquals(token.getEnd(), 0);
+    assertEquals(sofa, token.getSofa());
+    assertEquals(0.0f, token.getFloatValue(tokenFloatFeat));
+    assertEquals(null, token.getFeatureValue(tokenTypeFeat));
+    assertTrue(fsa.get(0) == token);
+    assertTrue(fsl.getHead() == token);
+
+	}
 
 	public void testSetArrayValuedFeature() {
 		FeatureStructure testFS = this.cas.createFS(this.arrayFsWithSubtypeType);
@@ -262,6 +363,16 @@ public class FeatureStructureTest extend
 		testString = "";
 		token.setStringValue(this.lemmaFeat, testString);
 		assertTrue(token.getStringValue(this.lemmaFeat).equals(testString));
+		
+		// test low level
+    LowLevelCAS llcas = cas.getLowLevelCAS();
+		token.setFeatureValue(tokenTypeFeat, word);
+		int fsRef = token.id();
+		int fc = ((FeatureImpl)tokenTypeFeat).getCode();
+		assertEquals(llcas.ll_getIntValue(fsRef, fc), word.id());
+		TOP word2 = cas.createFS(wordType);
+		llcas.ll_setIntValue(fsRef, fc, word2.id());
+		assertEquals(token.getFeatureValue(tokenTypeFeat), word2);
 	}
 
 	public void testSetFloatValue() {
@@ -291,7 +402,68 @@ public class FeatureStructureTest extend
 		}
 		assertTrue(caughtExc);
 		assertTrue(token.getFloatValue(this.tokenFloatFeat) == f);
+		
+		// low level
+		LowLevelCAS llcas = cas.getLowLevelCAS();
+		int ffc = ((FeatureImpl)tokenFloatFeat).getCode();
+		llcas.ll_setIntValue(token.id(), ffc, CASImpl.float2int(123.456f));
+		assertEquals(token.getFloatValue(tokenFloatFeat), 123.456f);
+		assertEquals(llcas.ll_getIntValue(token.id(), ffc), CASImpl.float2int(123.456f));
 	}
+	
+  public void testSetLongValue() {
+	  AnnotationFS token = (AnnotationFS) this.cas.createFS(this.tokenType);
+    assertTrue(token.getLongValue(this.tokenLongFeat) == 0.0f);
+    long f = -34L;
+    token.setLongValue(this.tokenLongFeat, f);
+    assertTrue(token.getLongValue(this.tokenLongFeat) == f);
+    f = 8_000_000_003L;
+    token.setLongValue(this.tokenLongFeat, f);
+    assertTrue(token.getLongValue(this.tokenLongFeat) == f);
+    f = -8_000_000_003L;
+    token.setLongValue(this.tokenLongFeat, f);
+    assertTrue(token.getLongValue(this.tokenLongFeat) == f);
+    
+    // low level
+    LowLevelCAS llcas = cas.getLowLevelCAS();
+    int ffc = ((FeatureImpl)tokenLongFeat).getCode();
+    int h = llcas.ll_getIntValue(token.id(), ffc);
+    assertEquals(1, h);
+    
+    long g = 23;
+    token.setLongValue(this.tokenLongFeat, g);
+    assertEquals(g, token.getLongValue(this.tokenLongFeat));
+    
+    llcas.ll_setIntValue(token.id(), ffc, h);
+    assertEquals(f, token.getLongValue(this.tokenLongFeat));
+  }
+
+  public void testSetDoubleValue() {
+    AnnotationFS token = (AnnotationFS) this.cas.createFS(this.tokenType);
+    assertTrue(token.getDoubleValue(this.tokenDoubleFeat) == 0.0f);
+    double f = -34.56D;
+    token.setDoubleValue(this.tokenDoubleFeat, f);
+    assertTrue(token.getDoubleValue(this.tokenDoubleFeat) == f);
+    f = 8_000_000_003.24852D;
+    token.setDoubleValue(this.tokenDoubleFeat, f);
+    assertTrue(token.getDoubleValue(this.tokenDoubleFeat) == f);
+    f = -8_000_000_003D;
+    token.setDoubleValue(this.tokenDoubleFeat, f);
+    assertTrue(token.getDoubleValue(this.tokenDoubleFeat) == f);
+    
+    // low level
+    LowLevelCAS llcas = cas.getLowLevelCAS();
+    int ffc = ((FeatureImpl)tokenDoubleFeat).getCode();
+    int h = llcas.ll_getIntValue(token.id(), ffc);
+    assertEquals(1, h);
+    
+    double g = 23;
+    token.setDoubleValue(this.tokenDoubleFeat, g);
+    assertEquals(g, token.getDoubleValue(this.tokenDoubleFeat));
+    
+    llcas.ll_setIntValue(token.id(), ffc, h);
+    assertEquals(f, token.getDoubleValue(this.tokenDoubleFeat));
+  }
 
 	public void testSetIntValue() {
 		AnnotationFS token = (AnnotationFS) this.cas.createFS(this.tokenType);
@@ -390,6 +562,27 @@ public class FeatureStructureTest extend
 		llc.ll_setStringValue(addr, lemmaFeatCode, "test", true);
 		assertTrue(llc.ll_getCharBufferValueSize(addr, lemmaFeatCode) == 4);
 
+		// try accessing low level strings using ll_setIntValue
+		
+		final int stringcode = llc.ll_getIntValue(addr,  lemmaFeatCode);
+		assertTrue(stringcode == 1);
+    llc.ll_setStringValue(addr, lemmaFeatCode, "test", true);
+    assertEquals(llc.ll_getIntValue(addr,  lemmaFeatCode), 1);  // should not change
+    llc.ll_setStringValue(addr, lemmaFeatCode, "test2", true);
+    assertEquals(llc.ll_getIntValue(addr,  lemmaFeatCode), 2);
+    llc.ll_setIntValue(addr,  lemmaFeatCode,  1);
+    assertEquals(llc.ll_getIntValue(addr,  lemmaFeatCode), 1);
+    assertEquals(llc.ll_getStringValue(addr, lemmaFeatCode), "test");
+    llc.ll_setIntValue(addr,  lemmaFeatCode,  0);
+    assertEquals(llc.ll_getIntValue(addr,  lemmaFeatCode), 0);
+    assertTrue(llc.ll_getStringValue(addr, lemmaFeatCode) == null);
+    llc.ll_setIntValue(addr,  lemmaFeatCode, 2);
+    assertEquals(llc.ll_getStringValue(addr,  lemmaFeatCode), "test2");
+    
+    // check that equal strings are shared
+    
+    llc.ll_setStringValue(addr, lemmaFeatCode, new String("test"));  
+    assertEquals(1, llc.ll_getIntValue(addr, lemmaFeatCode));
 	}
 
 	public void testEquals() {