public void TestInverseComparer()
        {
            InverseComparer ic1 = new InverseComparer();
            InverseComparer ic2 = new InverseComparer();

            Assert.IsNotNull(ic1);
            Assert.AreEqual(ic1, ic2);
            Assert.AreEqual(ic1.ToString(), ic2.ToString());
            Assert.AreEqual(ic1.GetHashCode(), ic2.GetHashCode());

            InverseComparer ic3 = new InverseComparer(IdentityExtractor.Instance);

            Assert.AreNotEqual(ic1, ic3);
            Assert.IsNotNull(ic3.Comparer);
            Assert.AreEqual(ic3.Comparer, IdentityExtractor.Instance);

            Assert.AreEqual(ic1.Compare(null, null), 0);
            Assert.AreEqual(ic1.Compare(new object(), null), -1);
            Assert.AreEqual(ic1.Compare(null, new object()), 1);
            try
            {
                Assert.AreEqual(ic1.Compare(new object(), new object()), 0);
            }
            catch (Exception e)
            {
                Assert.IsInstanceOf(typeof(ArgumentException), e);
            }

            SafeComparer sc = new SafeComparer(IdentityExtractor.Instance);

            Assert.AreEqual(ic1.Compare(10, 100), 1);
            Assert.AreEqual(ic3.Compare(10, 100), -sc.Compare(10, 100));


            TestQueryCacheEntry entry1 = new TestQueryCacheEntry("k2", "aaa");
            TestQueryCacheEntry entry2 = new TestQueryCacheEntry("k1", "zzz");

            ic3 = new InverseComparer(IdentityExtractor.Instance);
            sc  = new SafeComparer(IdentityExtractor.Instance);

            Assert.AreEqual(ic3.CompareEntries(entry2, entry1), -1);
            Assert.AreEqual(ic3.CompareEntries(entry2, entry1), -sc.CompareEntries(entry2, entry1));

            InverseComparer ic4 = new InverseComparer(new KeyExtractor("Key"));

            Assert.AreEqual(ic4.Compare(entry1, entry2), -1);
        }
        public void TestIdentityExtractor()
        {
            IValueExtractor extractor  = IdentityExtractor.Instance;
            IValueExtractor extractor1 = IdentityExtractor.Instance;

            Assert.IsNotNull(extractor);
            Assert.AreEqual(extractor, extractor1);
            Assert.AreEqual(extractor.ToString(), extractor1.ToString());
            Assert.AreEqual(extractor.GetHashCode(), extractor1.GetHashCode());

            object o  = new DictionaryEntry("key", "value");
            object o1 = extractor.Extract(o);

            Assert.AreEqual(o, o1);

            IdentityExtractor ie = extractor as IdentityExtractor;

            Assert.AreEqual(ie.Compare("ana", "cikic"), -1);

            TestQueryCacheEntry entry1 = new TestQueryCacheEntry("1", 1);
            TestQueryCacheEntry entry2 = new TestQueryCacheEntry("2", 2);

            Assert.AreEqual(ie.CompareEntries(entry2, entry1), 1);

            //testing on remote cache
            INamedCache cache = CacheFactory.GetCache(CacheName);

            cache.Clear();

            Hashtable ht = new Hashtable();

            ht.Add("identityExtractorKey1", 435);
            ht.Add("identityExtractorKey2", 253);
            ht.Add("identityExtractorKey3", 3);
            ht.Add("identityExtractorKey4", null);
            ht.Add("identityExtractorKey5", -3);
            cache.InsertAll(ht);

            IFilter     filter = new EqualsFilter(extractor, 253);
            ICollection keys   = cache.GetKeys(filter);

            Assert.Contains("identityExtractorKey2", (IList)keys);
            Assert.AreEqual(keys.Count, 1);

            CacheFactory.Shutdown();
        }
        public void TestSafeComparer()
        {
            SafeComparer sc1 = new SafeComparer();
            SafeComparer sc2 = new SafeComparer();

            Assert.IsNotNull(sc1);
            Assert.AreEqual(sc1, sc2);
            Assert.AreEqual(sc1.ToString(), sc2.ToString());
            Assert.AreEqual(sc1.GetHashCode(), sc2.GetHashCode());
            SafeComparer sc3 = new SafeComparer(IdentityExtractor.Instance);

            Assert.AreNotEqual(sc1, sc3);

            Assert.IsNotNull(sc3.Comparer);
            Assert.AreEqual(sc3.Comparer, IdentityExtractor.Instance);

            Assert.AreEqual(sc1.Compare(null, null), 0);
            Assert.AreEqual(sc1.Compare(new object(), null), 1);
            Assert.AreEqual(sc1.Compare(null, new object()), -1);
            try
            {
                Assert.AreEqual(sc1.Compare(new object(), new object()), 0);
            }
            catch (Exception e)
            {
                Assert.IsInstanceOf(typeof(ArgumentException), e);
            }

            Assert.AreEqual(sc1.Compare(10, 100), -1);
            Assert.AreEqual(sc3.Compare(10, 100), -1);


            TestQueryCacheEntry entry1 = new TestQueryCacheEntry("k2", "ana");
            TestQueryCacheEntry entry2 = new TestQueryCacheEntry("k1", "cana");

            sc3 = new SafeComparer(IdentityExtractor.Instance);
            Assert.AreEqual(sc3.CompareEntries(entry2, entry1), 1);
            IComparer c = new Comparer(CultureInfo.CurrentCulture);

            sc3 = new SafeComparer(c);
            Assert.AreEqual(sc3.CompareEntries(entry1, entry2), -1);
        }
        public void TestChainedComparer()
        {
            IComparer[] comparers = new IComparer[]
            {
                new SafeComparer(IdentityExtractor.Instance),
                new InverseComparer(IdentityExtractor.Instance)
            };

            ChainedComparer cc1 = new ChainedComparer(comparers);
            ChainedComparer cc2 = new ChainedComparer(comparers);

            Assert.IsNotNull(cc1);
            Assert.AreEqual(cc1, cc2);
            Assert.AreEqual(cc1.ToString(), cc2.ToString());
            Assert.AreEqual(cc1.GetHashCode(), cc2.GetHashCode());

            ChainedComparer cc3 = new ChainedComparer(comparers);

            Assert.IsNotNull(cc3.Comparers);
            Assert.IsInstanceOf(typeof(SafeComparer), cc3.Comparers[0]);
            Assert.IsInstanceOf(typeof(InverseComparer), cc3.Comparers[1]);

            Assert.AreEqual(cc3.Compare(null, null), 0);
            Assert.AreEqual(cc3.Compare(new object(), null), 1);
            Assert.AreEqual(cc3.Compare(null, new object()), -1);

            try
            {
                Assert.AreEqual(cc3.Compare(new object(), new object()), 0);
            }
            catch (Exception e)
            {
                Assert.IsInstanceOf(typeof(ArgumentException), e);
            }

            Assert.AreEqual(cc3.Compare(10, 100), -1);

            TestQueryCacheEntry entry1 = new TestQueryCacheEntry("k2", "aaa");
            TestQueryCacheEntry entry2 = new TestQueryCacheEntry("k1", "zzz");

            Assert.AreEqual(cc3.CompareEntries(entry2, entry1), 1);
        }
        public void TestEntryComparer()
        {
            EntryComparer ec1 = new EntryComparer();

            Assert.IsNotNull(ec1);
            Assert.IsNull(ec1.Comparer);
            Assert.AreEqual(ec1.ComparisonStyle, ComparisonStyle.Auto);

            EntryComparer ec2 = new EntryComparer(IdentityExtractor.Instance);
            EntryComparer ec3 = new EntryComparer(IdentityExtractor.Instance, ComparisonStyle.Auto);

            Assert.IsNotNull(ec2);
            Assert.AreEqual(ec2, ec3);
            Assert.AreEqual(ec2.ToString(), ec3.ToString());
            Assert.AreEqual(ec2.GetHashCode(), ec3.GetHashCode());
            Assert.IsTrue(ec2.CompareValue);
            Assert.IsFalse(ec2.CompareEntry);

            CacheEntry entry1 = new CacheEntry("k1", 100);
            CacheEntry entry2 = new CacheEntry("k2", 1);

            ec2 = new EntryComparer(new KeyExtractor(IdentityExtractor.Instance), ComparisonStyle.Auto);
            Assert.IsTrue(ec2.CompareKey);
            Assert.AreEqual(ec2.Compare(entry1, entry2), -1);

            ec2 = new EntryComparer(IdentityExtractor.Instance, ComparisonStyle.Auto);
            Assert.IsTrue(ec2.CompareValue);
            Assert.AreEqual(ec2.Compare(entry1, entry2), 1);

            ec2 = new EntryComparer(IdentityExtractor.Instance, ComparisonStyle.Entry);
            Assert.IsTrue(ec2.CompareEntry);
            Assert.AreEqual(ec2.Compare(entry1, entry2), 1);

            TestQueryCacheEntry qentry1 = new TestQueryCacheEntry("k1", 100);
            TestQueryCacheEntry qentry2 = new TestQueryCacheEntry("k2", 1);

            Assert.AreEqual(ec2.Compare(qentry1, qentry2), 1);
        }
        public void TestMultiExtractor()
        {
            IValueExtractor extractor = new MultiExtractor("field,Property,GetMethod");

            IValueExtractor re1 = new ReflectionExtractor("field");
            IValueExtractor re2 = new ReflectionExtractor("Property");
            IValueExtractor re3 = new ReflectionExtractor("GetMethod");

            IValueExtractor[] res = { re1, re2, re3 };

            IValueExtractor extractor1 = new MultiExtractor(res);

            Assert.IsNotNull(extractor);
            Assert.IsNotNull(extractor1);
            Assert.AreEqual(extractor, extractor1);
            Assert.AreEqual(extractor.ToString(), extractor1.ToString());
            Assert.AreEqual(extractor.GetHashCode(), extractor1.GetHashCode());

            IValueExtractor[] extractors = (extractor as MultiExtractor).Extractors;
            Assert.IsNotNull(extractors);
            Assert.AreEqual(extractors.Length, 3);
            Assert.AreEqual(extractors[0], re1);
            Assert.AreEqual(extractors[1], re2);
            Assert.AreEqual(extractors[2], re3);

            ReflectionTestType o1 = new ReflectionTestType();
            IList list            = (IList)extractor.Extract(o1);

            Assert.AreEqual(list.Count, extractors.Length);
            for (int i = 0; i < extractors.Length; i++)
            {
                Assert.AreEqual(list[i], extractors[i].Extract(o1));
            }
            Assert.IsNull(extractor.Extract(null));

            ReflectionTestType  o2     = new ReflectionTestType();
            TestQueryCacheEntry entry1 = new TestQueryCacheEntry("key1", o1);
            TestQueryCacheEntry entry2 = new TestQueryCacheEntry("key2", o2);

            Assert.AreEqual((extractor as MultiExtractor).CompareEntries(entry1, entry2), 0);
            o2.field = 100;
            Assert.AreEqual((extractor as MultiExtractor).CompareEntries(entry1, entry2), -1);

            // testing on remote cache
            INamedCache cache = CacheFactory.GetCache(CacheName);

            cache.Clear();

            Address a1 = new Address("street1", "city1", "state1", "zip1");
            Address a2 = new Address("treet2", "city2", "tate2", "zip2");
            Address a3 = new Address("street3", "city3", "state3", "zip3");

            Hashtable ht = new Hashtable();

            ht.Add("multiExtractorKey1", a1);
            ht.Add("multiExtractorKey2", a2);
            ht.Add("multiExtractorKey3", a3);
            cache.InsertAll(ht);

            extractor1 = new ReflectionExtractor("getStreet");
            IValueExtractor extractor2 = new ReflectionExtractor("getState");

            extractor = new MultiExtractor(new IValueExtractor[] { extractor1, extractor2 });

            IFilter     filter = new ContainsFilter(extractor, "street1");
            ICollection keys   = cache.GetKeys(filter);

            Assert.AreEqual(keys.Count, 1);
            Assert.Contains("multiExtractorKey1", (IList)keys);

            CacheFactory.Shutdown();
        }