/*
 * Copyright 1999-2011 Alibaba Group.
 *  
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *  
 *      http://www.apache.org/licenses/LICENSE-2.0
 *  
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.alibaba.dubbo.registry;


/**
 * @author ding.lid
 */
public class RegistryTestSupport {
    /*public static <T> void assertEqualsIgnoreOrde(Collection<T> expected, Collection<T> actual) {
        Set<T> expectedSet;
        if (expected instanceof Set) {
            expectedSet = (Set<T>) expected;
        } else {
            expectedSet = new HashSet<T>(expected);
        }

        Set<T> actualSet;
        if (actual instanceof Set) {
            actualSet = (Set<T>) actual;
        } else {
            actualSet = new HashSet<T>(actual);
        }

        Assert.assertEquals(expectedSet, actualSet);
    }

    public static final String              member_service_name = "com.alibaba.morgan.MemberService";

    public static final Map<String, String> member_urls1;
    static {
        Map<String, String> m = new HashMap<String, String>();
        m.put("remote://10.20.130.230:9090/memberService", "version=1.0.0");

        member_urls1 = Collections.unmodifiableMap(m);
    }

    public static final Map<String, String> member_urls2;
    static {
        Map<String, String> m = new HashMap<String, String>();
        m.put("remote://11.11.11.11:9090/memberService", "version=1.0.0");
        m.put("remote://22.22.22.22:9090/memberService", "version=1.0.0");
        m.put("remote://33.33.33.33:9090/memberService", "version=1.0.0");

        member_urls2 = Collections.unmodifiableMap(m);
    }

    public static final Map<String, String> member_urls3;
    static {
        Map<String, String> m = new HashMap<String, String>();
        m.put("remote://44.44.44.44:9090/memberService", "version=1.0.0");
        member_urls3 = Collections.unmodifiableMap(m);
    }

    public static final String              xxx_service_name    = "com.alibaba.xxx.XxxService";

    public static final Map<String, String> xxx_urls1;
    static {
        Map<String, String> m = new HashMap<String, String>();
        m.put("remote://11.11.11.11:9090/xxxService", "version=1.0.0");
        m.put("remote://22.22.22.22:9090/xxxService", "version=1.0.0");

        xxx_urls1 = Collections.unmodifiableMap(m);
    }

    public static void registerCheck(AbstractRegistry registry) {
        {
            List<URL> registeredList = registry
                    .getRegistered("com.alibaba.morgan.MemberService");
            assertEquals(0, registeredList.size());

            Map<String, Map<String, String>> registeredMap = registry.getRegistered();
            assertEquals(0, registeredMap.size());
        }

        {
            for (Map.Entry<String, String> entry : member_urls1.entrySet()) {
                registry.register(member_service_name, entry.getKey(), entry.getValue());
            }

            Map<String, String> registered = registry.getRegistered(member_service_name);
            assertEquals(1, registered.size());
            assertNotSame(member_urls1, registered);
            assertEquals(member_urls1, registered);

            Map<String, Map<String, String>> registeredMap = registry.getRegistered();
            assertEquals(1, registeredMap.size());
            assertTrue(registeredMap.containsKey(member_service_name));

            registered = registeredMap.get(member_service_name);
            assertEquals(1, registered.size());
            assertNotSame(member_urls1, registered);
            assertEquals(member_urls1, registered);
        }

        {
            registry.register(member_service_name, member_urls2);

            Map<String, String> registered = registry.getRegistered(member_service_name);

            final Map<String, String> urls = new HashMap<String, String>();
            urls.putAll(member_urls1);
            urls.putAll(member_urls2);

            assertEquals(urls, registered);

            Map<String, Map<String, String>> registeredMap = registry.getRegistered();
            assertEquals(1, registeredMap.size());
            assertTrue(registeredMap.containsKey(member_service_name));

            registered = registeredMap.get(member_service_name);
            assertEquals(urls, registered);
        }

        {
            Map<String, Map<String, String>> services = new HashMap<String, Map<String, String>>();
            services.put(member_service_name, member_urls3);
            services.put(xxx_service_name, xxx_urls1);

            registry.register(services);

            final Map<String, String> urls = new HashMap<String, String>();
            urls.putAll(member_urls1);
            urls.putAll(member_urls2);
            urls.putAll(member_urls3);
            {
                Map<String, String> registered = registry.getRegistered(member_service_name);
                assertEquals(urls, registered);

                registered = registry.getRegistered(xxx_service_name);
                assertEquals(xxx_urls1, registered);
            }

            {
                Map<String, Map<String, String>> registeredMap = registry.getRegistered();
                assertEquals(2, registeredMap.size());
                assertTrue(registeredMap.containsKey(member_service_name));
                assertTrue(registeredMap.containsKey(xxx_service_name));

                Map<String, String> registered = registeredMap.get(member_service_name);
                assertEquals(urls, registered);

                registered = registeredMap.get(xxx_service_name);
                assertEquals(xxx_urls1, registered);
            }
        }
    }

    public static void subscribeCheck(AbstractRegistry registry, NotificationListener mockNotifyListener) {
        String subscribed = registry.getSubscribed("com.alibaba.morgan.MemberService");
        assertNull(subscribed);

        Map<String, String> subscribedMap = registry.getSubscribed();
        assertEquals(0, subscribedMap.size());

        // query允许为null
        registry.subscribe("com.alibaba.xxx.XxxService", (String) null, mockNotifyListener);

        subscribed = registry.getSubscribed("com.alibaba.xxx.XxxService");
        assertEquals("", subscribed);

        subscribedMap = registry.getSubscribed();
        assertEquals(1, subscribedMap.size());
        assertTrue(subscribedMap.containsKey("com.alibaba.xxx.XxxService"));
        assertEquals("", subscribedMap.get("com.alibaba.xxx.XxxService"));

        registry.subscribe("com.alibaba.empty.EmptyService", "", mockNotifyListener);

        // query允许为空
        subscribed = registry.getSubscribed("com.alibaba.empty.EmptyService");
        assertEquals("", subscribed);

        subscribedMap = registry.getSubscribed();
        assertEquals(2, subscribedMap.size());
        assertTrue(subscribedMap.containsKey("com.alibaba.empty.EmptyService"));
        assertEquals("", subscribedMap.get("com.alibaba.empty.EmptyService"));

        // 多项值的Query
        registry.subscribe("com.alibaba.morgan.MemberService", "dog=bad,cat=god",
                mockNotifyListener);

        subscribed = registry.getSubscribed("com.alibaba.morgan.MemberService");
        assertEquals("dog=bad,cat=god", subscribed);

        subscribedMap = registry.getSubscribed();
        assertEquals(3, subscribedMap.size());
        String s = subscribedMap.get("com.alibaba.morgan.MemberService");
        assertEquals("dog=bad,cat=god", s);

        registry.subscribe("com.alibaba.complex.ComplexService",
                "version=1.0.0&application=kylin&methods=findPerson,findVAccount",
                mockNotifyListener);

        subscribedMap = registry.getSubscribed();
        assertEquals(4, subscribedMap.size());
        String q = subscribedMap.get("com.alibaba.complex.ComplexService");
        assertEquals("version=1.0.0&application=kylin&methods=findPerson,findVAccount", q);
    }*/
    
    public void testDummy() {
    }
}