浏览代码

tests: reflection

fix: CQuery #limit
fix: BitMask #containsAll
fix: reflective: hints
Ranides Atterwim 10 年之前
父节点
当前提交
d880099ba0

+ 8 - 5
assira/src/main/java/net/ranides/assira/collection/query/CQueryAbstract.java

@@ -256,7 +256,7 @@ abstract class CQueryAbstract<T> implements CQuery<T> {
         public CQArray(Supplier<T[]> source, int offset, int limit) {
             this.source = source;
             this.offset = offset;
-            this.limit = limit<0 ? (Integer.MAX_VALUE-offset) : limit;
+            this.limit = limit;
         }
         
         public CQArray(T[] source) {
@@ -264,22 +264,25 @@ abstract class CQueryAbstract<T> implements CQuery<T> {
         }
         
         public CQArray(T[] source, int offset, int limit) {
-            this(() -> source, offset, Math.min(source.length, limit));
+            this(() -> source, offset,limit);
         }
 
         @Override
         public Iterator<T> iterator() {
-            return ArrayUtils.iterator(source.get(), offset, offset+limit);
+            T[] array = source.get();
+            return ArrayUtils.iterator(array, offset, offset + Math.min(array.length,limit));
         }
 
         @Override
         public Spliterator<T> spliterator() {
-            return Arrays.spliterator(source.get(), offset, offset+limit);
+            T[] array = source.get();
+            return Arrays.spliterator(array, offset, offset + Math.min(array.length,limit));
         }
 
         @Override
         public Stream<T> stream() {
-            return Arrays.stream(source.get(), offset, offset+limit);
+            T[] array = source.get();
+            return Arrays.stream(array, offset, offset + Math.min(array.length,limit));
         }
 
         @Override

+ 1 - 1
assira/src/main/java/net/ranides/assira/collection/sets/Bitmask.java

@@ -113,7 +113,7 @@ public class Bitmask<T> {
         public boolean containsAll(Collection<?> object) {
             if(object instanceof CSet) {
                 CSet<?> that = (CSet<?>)object;
-                return (this.factory == that.factory) && (this.values==that.values);
+                return (this.factory == that.factory) && (that.values == (this.values &that.values));
             }
             return super.containsAll(object);
         }

+ 0 - 4
assira/src/main/java/net/ranides/assira/reflection/IClasses.java

@@ -7,14 +7,10 @@
 package net.ranides.assira.reflection;
 
 import java.lang.annotation.Annotation;
-import java.lang.reflect.Parameter;
 import java.lang.reflect.Type;
 import java.util.Set;
 import java.util.function.Predicate;
 import net.ranides.assira.collection.query.CQuery;
-import net.ranides.assira.reflection.impl.AClasses;
-import net.ranides.assira.reflection.impl.AHints;
-import net.ranides.assira.collection.query.CQueryBuilder;
 
 /**
  *

+ 2 - 0
assira/src/main/java/net/ranides/assira/reflection/IElements.java

@@ -20,6 +20,8 @@ public interface IElements<T> extends Iterable<T> {
     
     int count();
     
+    boolean isEmpty();
+    
     <R> CQuery<R> stream(Function<? super T, ? extends R> mapper);
     
     CQuery<T> stream();

+ 2 - 0
assira/src/main/java/net/ranides/assira/reflection/IHints.java

@@ -25,5 +25,7 @@ public interface IHints {
     IHints discard(IAttribute attr);
     
     IHints discard(Set<IAttribute> attrs);
+    
+    IHints replace(IHints value);
 
 }

+ 1 - 1
assira/src/main/java/net/ranides/assira/reflection/impl/AAnnotations.java

@@ -24,7 +24,7 @@ public class AAnnotations extends AElements<Annotation> implements IAnnotations
     AAnnotations(IHints hints, CQuery<Annotation> stream) {
         super(hints, stream);
     }
-
+    
     @Override
     public List<String> names() {
         return list(a -> a.annotationType().getName());

+ 2 - 2
assira/src/main/java/net/ranides/assira/reflection/impl/AClasses.java

@@ -54,7 +54,7 @@ public class AClasses extends AElements<IClass> implements IClasses {
 
     @Override
     public IClasses require(Class<? extends Annotation> annotation) {
-        return require(c -> null != c.annotations().require(annotation).first());
+        return require(c -> !c.annotations().require(annotation).isEmpty());
     }
 
     @Override
@@ -87,7 +87,7 @@ public class AClasses extends AElements<IClass> implements IClasses {
 
     @Override
     public IClasses discard(Class<? extends Annotation> annotation) {
-        return require(c -> null!=c.annotations().first(annotation));
+        return require(c -> c.annotations().require(annotation).isEmpty());
     }
 
     @Override

+ 8 - 3
assira/src/main/java/net/ranides/assira/reflection/impl/AElements.java

@@ -21,13 +21,13 @@ import net.ranides.assira.reflection.*;
  */
 public abstract class AElements<T> implements IElements<T> {
     
-    private IHints hints;
+    private final IHints hints;
     
     private CQuery<T> cquery;
 
     AElements(IHints hints, CQuery<T> cquery) {
         this.hints = hints;
-        this.cquery = cquery;
+        this.cquery = cquery; 
     }
 
     protected void filter(Predicate<? super T> predicate) {
@@ -59,6 +59,11 @@ public abstract class AElements<T> implements IElements<T> {
         return cquery.size();
     }
     
+    @Override
+    public boolean isEmpty() {
+        return cquery.isEmpty();
+    }
+    
     @Override
     public <R> List<R> list(Function<? super T, ? extends R> mapper) {
         return cquery.map(mapper).list();
@@ -81,7 +86,7 @@ public abstract class AElements<T> implements IElements<T> {
 
     @Override
     public IElements<T> hint(IHints hints) {
-        this.hints = hints;
+        this.hints.replace(hints);
         return this;
     }
     

+ 9 - 2
assira/src/main/java/net/ranides/assira/reflection/impl/AHints.java

@@ -21,9 +21,9 @@ public class AHints implements IHints {
 
     static final AHints EMPTY = new AHints(new NULLSet(), new NULLSet());
     
-    private final Set<IAttribute> require;
+    private Set<IAttribute> require;
     
-    private final Set<IAttribute> discard;
+    private Set<IAttribute> discard;
 
     AHints(Set<IAttribute> require, Set<IAttribute> discard) {
         this.require = require;
@@ -67,6 +67,13 @@ public class AHints implements IHints {
         discard.addAll(attrs);
         return this;
     }
+
+    @Override
+    public IHints replace(IHints value) {
+        require = value.require();
+        discard = value.discard();
+        return this;
+    }
     
     public boolean hintNoPublic() {
         return 

+ 208 - 0
assira/src/test/java/net/ranides/assira/reflection/impl/AClassesTest.java

@@ -0,0 +1,208 @@
+/*
+ * @author Ranides Atterwim <ranides@gmail.com>
+ * @copyright Ranides Atterwim
+ * @license WTFPL
+ * @url http://ranides.net/projects/assira
+ */
+package net.ranides.assira.reflection.impl;
+
+import java.util.Arrays;
+import java.util.List;
+import net.ranides.assira.annotations.Meta;
+import net.ranides.assira.reflection.IClass;
+import net.ranides.assira.reflection.IClasses;
+import net.ranides.assira.reflection.mockup.ForClassTraits;
+import org.junit.Test;
+import static net.ranides.assira.junit.NewAssert.*;
+import static net.ranides.assira.reflection.IAttribute.*;
+import net.ranides.assira.reflection.IMethod;
+import net.ranides.assira.reflection.mockup.ForMemberTraits;
+
+/**
+ *
+ * @author Ranides Atterwim <ranides@gmail.com>
+ */
+public class AClassesTest {
+    
+    private static final IClass STRING = IClass.typeinfo(String.class);
+    private static final IClass INTEGER = IClass.typeinfo(Integer.class);
+    private static final IClass NUMBER = IClass.typeinfo(Number.class);
+    private static final IClass TI = IClass.typeinfo(ForClassTraits.INTERFACE);
+    private static final IClass A1 = IClass.typeinfo(ForClassTraits.CAnnotated1.class);
+    private static final IClass A2 = IClass.typeinfo(ForClassTraits.CAnnotated2.class);
+    
+    private static final IClass IB1 = IClass.typeinfo(ForMemberTraits.Bean.class);
+    private static final IClass IB2 = IClass.typeinfo(ForMemberTraits.Bean2.class);
+
+
+    @Test
+    public void testNames() {
+        IClasses ic = new AClasses(new IClass[]{STRING, INTEGER, NUMBER, TI});
+        
+        List<String> names = Arrays.asList(
+            "java.lang.String", 
+            "java.lang.Integer", 
+            "java.lang.Number", 
+            "net.ranides.assira.reflection.mockup.ForClassTraits$CInterface"
+        );
+        
+        assertEquals(names, ic.names());
+    }
+    
+    @Test
+    public void testRequire() {
+        
+        List<String> exp1 = Arrays.asList(
+            "net.ranides.assira.reflection.mockup.ForClassTraits$CAnnotated1", 
+            "net.ranides.assira.reflection.mockup.ForClassTraits$CAnnotated2"
+        );
+        List<String> exp2 = Arrays.asList(
+            "net.ranides.assira.reflection.mockup.ForClassTraits$CAnnotated2"
+        );
+        List<String> exp3 = Arrays.asList(
+            "net.ranides.assira.reflection.mockup.ForClassTraits$CInterface"
+        );
+        List<String> exp4 = Arrays.asList(
+            "java.lang.String", "java.lang.Integer"
+        );
+        List<String> exp5 = Arrays.asList(
+            "java.lang.String"
+        );
+        List<String> exp6 = Arrays.asList(
+            "net.ranides.assira.reflection.mockup.ForMemberTraits$Bean",
+            "net.ranides.assira.reflection.mockup.ForMemberTraits$Bean2"
+        );
+        
+        assertEquals(exp1, iclist().require(Meta.Immutable.class).names());
+        
+        assertEquals(exp1, iclist().require(A1.annotations()).names());
+        assertEquals(exp2, iclist().require(A2.annotations()).names());
+        
+        assertEquals(exp3, iclist().require(INTERFACE).names());
+        
+        assertEquals(exp4, iclist().require(collect(PUBLIC, FINAL)).names());
+        
+        IMethod m = STRING.methods().require("valueOf").first();
+        assertEquals(exp5, iclist().require(m).names());
+
+        IClasses ic2 = new AClasses(new IClass[]{INTEGER, IB1, IB2});
+        IMethod m2 = IB1.methods().require("getName1").first();
+        assertEquals(exp6, ic2.require(m2).names());
+
+    }
+    
+    @Test
+    public void testDiscard() {
+        
+        List<String> exp1 = Arrays.asList(
+            "java.lang.String", 
+            "java.lang.Integer", 
+            "java.lang.Number", 
+            "net.ranides.assira.reflection.mockup.ForClassTraits$CInterface"
+        );
+        List<String> exp2 = Arrays.asList(
+            "java.lang.String", 
+            "java.lang.Integer", 
+            "java.lang.Number", 
+            "net.ranides.assira.reflection.mockup.ForClassTraits$CInterface",
+            "net.ranides.assira.reflection.mockup.ForClassTraits$CAnnotated1"
+        );
+        List<String> exp3 = Arrays.asList(
+            "java.lang.Number", 
+            "net.ranides.assira.reflection.mockup.ForClassTraits$CInterface", 
+            "net.ranides.assira.reflection.mockup.ForClassTraits$CAnnotated1", 
+            "net.ranides.assira.reflection.mockup.ForClassTraits$CAnnotated2"
+        );
+        List<String> exp4 = Arrays.asList(
+            "java.lang.Number", 
+            "net.ranides.assira.reflection.mockup.ForClassTraits$CInterface", 
+            "net.ranides.assira.reflection.mockup.ForClassTraits$CAnnotated1", 
+            "net.ranides.assira.reflection.mockup.ForClassTraits$CAnnotated2"
+        );
+        List<String> exp5 = Arrays.asList(
+            "java.lang.Integer", 
+            "java.lang.Number", 
+            "net.ranides.assira.reflection.mockup.ForClassTraits$CInterface", 
+            "net.ranides.assira.reflection.mockup.ForClassTraits$CAnnotated1", 
+            "net.ranides.assira.reflection.mockup.ForClassTraits$CAnnotated2"
+        );
+        List<String> exp6 = Arrays.asList(
+            "java.lang.Integer"
+        );
+        List<String> exp7 = Arrays.asList(
+            "java.lang.String", "java.lang.Integer", "java.lang.Number"
+        );
+        
+        assertEquals(exp1, iclist().discard(Meta.Immutable.class).names());
+        assertEquals(exp2, iclist().discard(Meta.Unsafe.class).names());
+        
+        assertEquals(exp1, iclist().discard(A1.annotations()).names());
+        assertEquals(exp1, iclist().discard(A2.annotations()).names());
+        
+        assertEquals(exp3, iclist().discard(FINAL).names());
+        
+        assertEquals(exp4, iclist().discard(collect(PUBLIC,FINAL)).names());
+        
+        IMethod m = STRING.methods().require("valueOf").first();
+        assertEquals(exp5, iclist().discard(m).names());
+
+        IClasses ic2 = new AClasses(new IClass[]{INTEGER, IB1, IB2});
+        IMethod m2 = IB1.methods().require("getName1").first();
+        assertEquals(exp6, ic2.discard(m2).names());
+        
+        assertEquals(exp7, iclist().discard(n -> n.name().startsWith("net.")).names());
+        
+
+    }
+    
+    @Test
+    public void testFields() {
+        List<String> exp1 = Arrays.asList(
+            "CASE_INSENSITIVE_ORDER", 
+            "MIN_VALUE", 
+            "MAX_VALUE", 
+            "TYPE", 
+            "SIZE", 
+            "BYTES"
+        );
+        List<String> exp2 = Arrays.asList(
+            "serialVersionUID", 
+            "serialVersionUID", 
+            "serialVersionUID", 
+            "value", 
+            "value", 
+            "serialPersistentFields", 
+            "hash"
+        );
+        List<String> exp3 = Arrays.asList(
+            "serialVersionUID", 
+            "serialVersionUID", 
+            "serialVersionUID", 
+            "this$0", 
+            "this$0",
+            "value", 
+            "value", 
+            "sizeTable", 
+            "serialPersistentFields", 
+            "hash", 
+            "digits", 
+            "DigitTens", 
+            "DigitOnes", 
+            "TYPE", 
+            "SIZE", 
+            "MIN_VALUE", 
+            "MAX_VALUE", 
+            "CASE_INSENSITIVE_ORDER", 
+            "BYTES"
+        );
+        
+        assertEquivalent(exp1, iclist().fields().names());
+        assertEquivalent(exp2, iclist().fields().require(PRIVATE).names());
+        assertEquivalent(exp3, iclist().fields().require(DECLARED).names());
+    }
+    
+    private static AClasses iclist() {
+        return new AClasses(new IClass[]{STRING, INTEGER, NUMBER, TI, A1, A2});
+    }
+    
+}

+ 8 - 0
assira/src/test/java/net/ranides/assira/reflection/mockup/ForClassTraits.java

@@ -7,6 +7,7 @@
 package net.ranides.assira.reflection.mockup;
 
 import java.util.ArrayList;
+import net.ranides.assira.annotations.Meta;
 
 /**
  *
@@ -47,4 +48,11 @@ public class ForClassTraits {
     
     class CNoParams extends ArrayList<Integer> { }
     
+    @Meta.Immutable
+    public class CAnnotated1 { }
+    
+    @Meta.Immutable
+    @Meta.Unsafe    
+    public class CAnnotated2 { }
+    
 }

+ 2 - 0
assira/src/test/java/net/ranides/assira/xml/impl/CElementsTest.java

@@ -13,6 +13,7 @@ import net.ranides.assira.collection.iterators.IteratorUtils;
 import net.ranides.assira.collection.suite.IteratorTester;
 import net.ranides.assira.xml.XMLElement;
 import static net.ranides.assira.xml.XMLQuery.$;
+import org.junit.Ignore;
 import org.junit.Test;
 
 /**
@@ -23,6 +24,7 @@ public class CElementsTest {
 
     // @todo (assira #0) xml: test
 
+    @Ignore
     @Test
     public void testIterator() {
         XMLElement doc = $(new File("src/test/resources/eclipse/cheatsheet.xml"));