public void TesteInserirElementosNoMesmoEDiferenteSubIndex()
        {
            var hc = new HoplonCollection();

            Assert.IsTrue(hc.Add("ano.nascimento", 1980, "pedro"));
            Assert.IsFalse(hc.Add("ano.nascimento", 1981, "pedro"));
            Assert.IsTrue(hc.Add("ano.nascimento", 1980, "joao"));
            Assert.IsTrue(hc.Add("ano.nascimento", 1982, "paulo"));

            var retornoGet = hc.Get("ano.nascimento", 0, 0);

            Assert.AreEqual(retornoGet.Count(), 3);
            Assert.AreEqual(retornoGet[0], "joao");  // 1980
            Assert.AreEqual(retornoGet[1], "pedro"); // 1981
            Assert.AreEqual(retornoGet[2], "paulo"); // 1982

            var retorno = hc.RetornoApoioTeste();

            Assert.AreEqual(retorno.Count, 1);

            var sub1980 = retorno.First().Value.First(s => s.Key == 1980);

            Assert.AreEqual(sub1980.Value.Count, 1);
            Assert.AreEqual(sub1980.Value.First(), "joao");

            var sub1981 = retorno.First().Value.First(s => s.Key == 1981);

            Assert.AreEqual(sub1981.Value.Count, 1);
            Assert.AreEqual(sub1981.Value.First(), "pedro");

            var sub1982 = retorno.First().Value.First(s => s.Key == 1982);

            Assert.AreEqual(sub1982.Value.Count, 1);
            Assert.AreEqual(sub1982.Value.First(), "paulo");
        }
        public void TesteInserirElementosNoMesmoSubIndex()
        {
            var hc = new HoplonCollection();

            Assert.IsTrue(hc.Add("ano.nascimento", 1980, "pedro"));
            Assert.IsFalse(hc.Add("ano.nascimento", 1981, "pedro"));
            Assert.IsTrue(hc.Add("ano.nascimento", 1980, "joao"));

            var retorno = hc.Get("ano.nascimento", 0, 0);

            Assert.AreEqual(retorno.Count(), 2);
            Assert.AreEqual(retorno[0], "joao");
            Assert.AreEqual(retorno[1], "pedro");

            var RetornoApoioTeste = hc.RetornoApoioTeste();

            Assert.AreEqual(RetornoApoioTeste.Count, 1);
            Assert.AreEqual(RetornoApoioTeste.First().Key, "ano.nascimento");

            // Verificar quantidade de subIndex deve ser 2.
            Assert.AreEqual(RetornoApoioTeste.First().Value.Count, 2);

            var subIndex1980 = RetornoApoioTeste.First().Value.First(s => s.Key == 1980);

            Assert.AreEqual(subIndex1980.Value.Count, 1);
            Assert.AreEqual(subIndex1980.Value.First(), "joao");

            var subIndex1981 = RetornoApoioTeste.First().Value.First(s => s.Key == 1981);

            Assert.AreEqual(subIndex1981.Value.Count, 1);
            Assert.AreEqual(subIndex1981.Value.First(), "pedro");
        }
        public void TesteRemoverChaveExistenteEDeixarOutras()
        {
            var hc = new HoplonCollection();

            Assert.IsTrue(hc.Add("nomes", 1980, "Carlos"));
            Assert.IsTrue(hc.Add("nomes", 1980, "Willian"));
            Assert.IsTrue(hc.Add("nomes", 1980, "Cristiano"));
            Assert.IsTrue(hc.Add("nomes", 1980, "Cristiano Craujo"));
            Assert.IsTrue(hc.Add("nomes", 1980, "Cristiano Braujo"));
            Assert.IsTrue(hc.Add("nomes", 1980, "Cristiano Araujo"));

            Assert.IsTrue(hc.Add("carro", 7854, "Fusca"));
            Assert.IsTrue(hc.Add("carro", 9515, "Gol"));
            Assert.IsTrue(hc.Add("carro", 3456, "Opala"));

            Assert.IsTrue(hc.Add("jogos", 7654, "Futebol"));
            Assert.IsTrue(hc.Add("jogos", 3474, "gude"));
            Assert.IsTrue(hc.Add("jogos", 7895, "ping pong"));

            Assert.IsTrue(hc.Remove("jogos"));

            var retorno = hc.Get("nomes", 0, 0);

            Assert.AreEqual(retorno.Count, 6);

            retorno = hc.Get("carro", 0, 0);
            Assert.AreEqual(retorno.Count, 3);

            retorno = hc.Get("jogos", 0, 0);
            Assert.AreEqual(retorno.Count, 0);

            // Tentar remover novamente
            Assert.IsFalse(hc.Remove("jogos"));
        }
        public void TesteRemoverChaveESubIndexComOutrosExistentes()
        {
            var hc = new HoplonCollection();

            Assert.IsTrue(hc.Add("nomes", 1980, "Carlos"));
            Assert.IsTrue(hc.Add("nomes", 1980, "Willian"));
            Assert.IsTrue(hc.Add("nomes", 1980, "Cristiano"));
            Assert.IsTrue(hc.Add("nomes", 1980, "Cristiano Craujo"));
            Assert.IsTrue(hc.Add("nomes", 1980, "Cristiano Braujo"));
            Assert.IsTrue(hc.Add("nomes", 1980, "Cristiano Araujo"));

            Assert.IsTrue(hc.Add("nomes", 2000, "Fusca"));
            Assert.IsTrue(hc.Add("nomes", 2000, "Gol"));
            Assert.IsTrue(hc.Add("nomes", 2000, "Opala"));

            Assert.IsTrue(hc.Add("nomes", 8885, "Futebol"));
            Assert.IsTrue(hc.Add("nomes", 8885, "gude"));
            Assert.IsTrue(hc.Add("nomes", 8885, "ping pong"));

            Assert.IsTrue(hc.RemoveValuesFromSubIndex("nomes", 2000));

            var retorno = hc.Get("nomes", 0, 0);

            Assert.AreEqual(retorno.Count, 9);
        }
        public void TesteInserirElementosEmChavesDiferentesComSubIndexIguais()
        {
            var hc = new HoplonCollection();

            Assert.IsTrue(hc.Add("ano.nascimento", 1980, "pedro"));
            Assert.IsTrue(hc.Add("ano.nascimento", 1980, "maria"));
            Assert.IsTrue(hc.Add("ano.nascimento", 1980, "joao"));

            Assert.IsTrue(hc.Add("cidades", 1980, "pedro"));
            Assert.IsTrue(hc.Add("cidades", 1980, "maria"));
            Assert.IsTrue(hc.Add("cidades", 1980, "joao"));

            var retornoGet = hc.Get("ano.nascimento", 0, 0);

            Assert.AreEqual(retornoGet.Count(), 3);
            Assert.AreEqual(retornoGet[0], "joao");
            Assert.AreEqual(retornoGet[1], "maria");
            Assert.AreEqual(retornoGet[2], "pedro");

            retornoGet = hc.Get("cidades", 0, 0);
            Assert.AreEqual(retornoGet.Count(), 3);
            Assert.AreEqual(retornoGet[0], "joao");
            Assert.AreEqual(retornoGet[1], "maria");
            Assert.AreEqual(retornoGet[2], "pedro");

            var retorno = hc.RetornoApoioTeste();

            // Qtd de chaves
            Assert.AreEqual(retorno.Count, 2);

            // Chave ano.nasc
            var anoNasc = retorno.First(s => s.Key == "ano.nascimento");

            Assert.AreEqual(anoNasc.Value.Count, 1); // Apenas um subIndice
            Assert.IsTrue(anoNasc.Value.Any(s => s.Key == 1980));

            // subIndices de anoNasc
            var siAnoNasc = anoNasc.Value.First().Value;

            Assert.IsTrue(siAnoNasc.Any(s => s == "pedro"));
            Assert.IsTrue(siAnoNasc.Any(s => s == "maria"));
            Assert.IsTrue(siAnoNasc.Any(s => s == "joao"));

            // Chave cidades
            var cidades = retorno.First(s => s.Key == "cidades");

            Assert.AreEqual(cidades.Value.Count, 1); // Apenas um subIndice
            Assert.IsTrue(cidades.Value.Any(s => s.Key == 1980));

            // subIndices de cidades
            var siCidades = cidades.Value.First().Value;

            Assert.IsTrue(siCidades.Any(s => s == "pedro"));
            Assert.IsTrue(siCidades.Any(s => s == "maria"));
            Assert.IsTrue(siCidades.Any(s => s == "joao"));
        }
        public void TesteInserirElementosMaisSubIndex()
        {
            var hc = new HoplonCollection();

            Assert.IsTrue(hc.Add("ano.nascimento", 1980, "pedro"));
            Assert.IsTrue(hc.Add("ano.nascimento", 1980, "maria"));
            Assert.IsTrue(hc.Add("ano.nascimento", 1980, "joao"));

            Assert.IsFalse(hc.Add("ano.nascimento", 2000, "pedro"));
            Assert.IsFalse(hc.Add("ano.nascimento", 2000, "maria"));
            Assert.IsFalse(hc.Add("ano.nascimento", 2000, "joao"));

            Assert.IsFalse(hc.Add("ano.nascimento", 2015, "pedro"));
            Assert.IsFalse(hc.Add("ano.nascimento", 2015, "maria"));
            Assert.IsFalse(hc.Add("ano.nascimento", 2015, "joao"));

            Assert.IsFalse(hc.Add("ano.nascimento", 2020, "pedro"));
            Assert.IsFalse(hc.Add("ano.nascimento", 2020, "maria"));
            Assert.IsFalse(hc.Add("ano.nascimento", 2020, "joao"));

            var retornoGet = hc.Get("ano.nascimento", 0, 0);

            Assert.AreEqual(retornoGet.Count(), 3);
            Assert.AreEqual(retornoGet[0], "joao");
            Assert.AreEqual(retornoGet[1], "maria");
            Assert.AreEqual(retornoGet[2], "pedro");

            var retorno = hc.RetornoApoioTeste();

            Assert.AreEqual(retorno.First().Key, "ano.nascimento");
            Assert.AreEqual(retorno.First().Value.Count, 4);

            //subIndx 1980
            var si1980 = retorno.First().Value.First(s => s.Key == 1980);

            Assert.AreEqual(si1980.Value.Count, 0);

            //subIndx 2000
            var si2000 = retorno.First().Value.First(s => s.Key == 2000);

            Assert.AreEqual(si2000.Value.Count, 0);

            //subIndx 2015
            var si2015 = retorno.First().Value.First(s => s.Key == 2015);

            Assert.AreEqual(si2015.Value.Count, 0);

            //subIndx 2020
            var si2020 = retorno.First().Value.First(s => s.Key == 2020);

            Assert.AreEqual(si2020.Value.Count, 3);
            Assert.IsTrue(si2020.Value.Any(s => s == "pedro"));
            Assert.IsTrue(si2020.Value.Any(s => s == "joao"));
            Assert.IsTrue(si2020.Value.Any(s => s == "maria"));
        }
        public void TesteRemoverChaveESubIndex()
        {
            var hc = new HoplonCollection();

            Assert.IsTrue(hc.Add("nomes", 1980, "Carlos"));
            Assert.IsTrue(hc.Add("nomes", 1980, "Willian"));
            Assert.IsTrue(hc.Add("nomes", 1980, "Cristiano"));
            Assert.IsTrue(hc.Add("nomes", 1980, "Cristiano Craujo"));
            Assert.IsTrue(hc.Add("nomes", 1980, "Cristiano Braujo"));
            Assert.IsTrue(hc.Add("nomes", 1980, "Cristiano Araujo"));

            Assert.IsTrue(hc.RemoveValuesFromSubIndex("nomes", 1980));

            var retorno = hc.Get("nomes", 0, 0);

            Assert.AreEqual(retorno.Count, 0);
        }
        public void TesteRemoverChaveNaoExistente()
        {
            var hc = new HoplonCollection();

            Assert.IsTrue(hc.Add("nomes", 1980, "Carlos"));
            Assert.IsTrue(hc.Add("nomes", 1980, "Willian"));
            Assert.IsTrue(hc.Add("nomes", 1980, "Cristiano"));
            Assert.IsTrue(hc.Add("nomes", 1980, "Cristiano Craujo"));
            Assert.IsTrue(hc.Add("nomes", 1980, "Cristiano Braujo"));
            Assert.IsTrue(hc.Add("nomes", 1980, "Cristiano Araujo"));

            Assert.IsFalse(hc.Remove("chaves"));

            var retorno = hc.Get("nomes", 0, 0);

            Assert.AreEqual(retorno.Count, 6);
        }
        public void TesteBuscarComMaisChavesExistentesSubDiferentes()
        {
            var hc = new HoplonCollection();

            Assert.IsTrue(hc.Add("nomes", 48, "Carlos"));
            Assert.IsTrue(hc.Add("nomes", 8563, "Willian"));
            Assert.IsTrue(hc.Add("nomes", 2487, "Cristiano"));
            Assert.IsTrue(hc.Add("nomes", 885, "Cristiano Craujo"));
            Assert.IsTrue(hc.Add("nomes", 7446, "Cristiano Braujo"));
            Assert.IsTrue(hc.Add("nomes", 9866, "Cristiano Araujo"));

            Assert.IsTrue(hc.Add("carro", 7854, "Fusca"));
            Assert.IsTrue(hc.Add("carro", 9515, "Gol"));
            Assert.IsTrue(hc.Add("carro", 3456, "Opala"));

            Assert.IsTrue(hc.Add("jogos", 7654, "Futebol"));
            Assert.IsTrue(hc.Add("jogos", 3474, "gude"));
            Assert.IsTrue(hc.Add("jogos", 7895, "ping pong"));

            string[] compareNomes = { "Cristiano Craujo", "Cristiano", "Cristiano Braujo" };
            string[] compareCarro = { "Fusca", "Gol" };
            string[] compareJogos = { "Futebol", "ping pong" };

            var retorno = hc.Get("nomes", 1, 3);

            Assert.AreEqual(retorno.Count, 3);
            Parallel.For(0, 3, i =>
            {
                Assert.AreEqual(retorno[i], compareNomes[i]);
            });

            retorno = hc.Get("carro", 1, 3);
            Assert.AreEqual(retorno.Count, 2);
            Parallel.For(0, 2, i =>
            {
                Assert.AreEqual(retorno[i], compareCarro[i]);
            });

            retorno = hc.Get("jogos", 1, 2);
            Assert.AreEqual(retorno.Count, 2);
            Parallel.For(0, 2, i =>
            {
                Assert.AreEqual(retorno[i], compareJogos[i]);
            });
        }
        public void TesteRetornarIndexElementoComUmSubIndice()
        {
            var hc = new HoplonCollection();

            Assert.IsTrue(hc.Add("nomes", 1980, "Carlos"));
            Assert.IsTrue(hc.Add("nomes", 1980, "Willian"));
            Assert.IsTrue(hc.Add("nomes", 1980, "Cristiano"));
            Assert.IsTrue(hc.Add("nomes", 1980, "Cristiano Craujo"));
            Assert.IsTrue(hc.Add("nomes", 1980, "Cristiano Braujo"));
            Assert.IsTrue(hc.Add("nomes", 1980, "Cristiano Araujo"));

            var retorno = hc.Get("nomes", 0, 0);

            // nao esquecer de considerar a ordenação.
            Assert.AreEqual(hc.IndexOf("nomes", "willian"), 5);
            Assert.AreEqual(hc.IndexOf("nomes", "Cristiano Araujo"), 2);
            Assert.AreEqual(hc.IndexOf("nomes", "carlos"), 0);
        }
        public void TesteBuscarComMaisChavesExistentesSubIguais()
        {
            var hc = new HoplonCollection();

            Assert.IsTrue(hc.Add("nomes", 1980, "Carlos"));
            Assert.IsTrue(hc.Add("nomes", 1980, "Willian"));
            Assert.IsTrue(hc.Add("nomes", 1980, "Cristiano"));
            Assert.IsTrue(hc.Add("nomes", 1980, "Cristiano Craujo"));
            Assert.IsTrue(hc.Add("nomes", 1980, "Cristiano Braujo"));
            Assert.IsTrue(hc.Add("nomes", 1980, "Cristiano Araujo"));

            Assert.IsTrue(hc.Add("carro", 1980, "Gol"));
            Assert.IsTrue(hc.Add("carro", 1980, "Parati"));
            Assert.IsTrue(hc.Add("carro", 1980, "Fusion"));

            Assert.IsTrue(hc.Add("jogos", 1980, "dama"));
            Assert.IsTrue(hc.Add("jogos", 1980, "Futebol"));
            Assert.IsTrue(hc.Add("jogos", 1980, "Basquete"));


            string[] compareNomes = { "Cristiano", "Cristiano Araujo", "Cristiano Braujo" };
            string[] compareCarro = { "Gol", "Parati" };
            string[] compareJogos = { "dama", "Futebol" };

            var retorno = hc.Get("nomes", 1, 3);

            Assert.AreEqual(retorno.Count, 3);
            Parallel.For(0, 3, i =>
            {
                Assert.AreEqual(retorno[i], compareNomes[i]);
            });

            retorno = hc.Get("carro", 1, 3);
            Parallel.For(0, 2, i =>
            {
                Assert.AreEqual(retorno[i], compareCarro[i]);
            });

            retorno = hc.Get("jogos", 1, 3);
            Parallel.For(0, 2, i =>
            {
                Assert.AreEqual(retorno[i], compareJogos[i]);
            });
        }
        public void TestarOrdenacaoDeChaves()
        {
            var hc = new HoplonCollection();

            Assert.IsTrue(hc.Add("cidades", 2001, "Goiás"));

            Assert.IsTrue(hc.Add("países", 1982, "BR"));

            Assert.IsTrue(hc.Add("bairros", 1980, "Atheneu"));

            Assert.IsTrue(hc.Add("nomes", 1981, "Mercia"));

            var retorno = hc.RetornoApoioTeste();

            string[] compare = { "bairros", "cidades", "nomes", "países" };

            var retornoGet = hc.Get("cidades", 0, 0);

            Assert.AreEqual(retornoGet.Count(), 1);
            Assert.AreEqual(retornoGet[0], "Goiás");

            retornoGet = hc.Get("países", 0, 0);
            Assert.AreEqual(retornoGet.Count(), 1);
            Assert.AreEqual(retornoGet[0], "BR");

            retornoGet = hc.Get("bairros", 0, 0);
            Assert.AreEqual(retornoGet.Count(), 1);
            Assert.AreEqual(retornoGet[0], "Atheneu");

            retornoGet = hc.Get("nomes", 0, 0);
            Assert.AreEqual(retornoGet.Count(), 1);
            Assert.AreEqual(retornoGet[0], "Mercia");

            // Qtd de chaves
            Assert.AreEqual(retorno.Count, 4);

            var tam = retorno.First().Value.Count;

            Parallel.For(0, tam, i =>
            {
                Assert.AreEqual(retorno[0].Key, compare[i]);
            });
        }
        public void TestarBuscarRegistrosComStartNegativo1()
        {
            var hc = new HoplonCollection();

            Assert.IsTrue(hc.Add("nomes", 1980, "Carlos"));
            Assert.IsTrue(hc.Add("nomes", 1980, "Willian"));
            Assert.IsTrue(hc.Add("nomes", 1980, "Cristiano"));
            Assert.IsTrue(hc.Add("nomes", 1980, "Cristiano Craujo"));
            Assert.IsTrue(hc.Add("nomes", 1980, "Cristiano Braujo"));
            Assert.IsTrue(hc.Add("nomes", 1980, "Cristiano Araujo"));

            var retorno = hc.Get("nomes", -1, 0);

            string[] compare = { "Carlos", "Cristiano", "Cristiano Araujo", "Cristiano Braujo", "Cristiano Craujo", "Willian" };

            Assert.AreEqual(retorno.Count, 6);
            Parallel.For(0, 6, i =>
            {
                Assert.AreEqual(retorno[i], compare[i]);
            });
        }
        public void TestarBuscarRegistrosComOffSetComUmSubIndice()
        {
            var hc = new HoplonCollection();

            Assert.IsTrue(hc.Add("nomes", 1980, "Carlos"));
            Assert.IsTrue(hc.Add("nomes", 1980, "Willian"));
            Assert.IsTrue(hc.Add("nomes", 1980, "Cristiano"));
            Assert.IsTrue(hc.Add("nomes", 1980, "Cristiano Craujo"));
            Assert.IsTrue(hc.Add("nomes", 1980, "Cristiano Braujo"));
            Assert.IsTrue(hc.Add("nomes", 1980, "Cristiano Araujo"));

            var retorno = hc.Get("nomes", 1, 3);

            string[] compare = { "Cristiano", "Cristiano Araujo", "Cristiano Braujo" };

            Assert.AreEqual(retorno.Count, 3);
            Parallel.For(0, 3, i =>
            {
                Assert.AreEqual(retorno[i], compare[i]);
            });
        }
        public void TesteInserirElementosSubIndex()
        {
            var hc = new HoplonCollection();

            Assert.IsTrue(hc.Add("ano.nascimento", 1980, "pedro"));
            Assert.IsFalse(hc.Add("ano.nascimento", 1980, "pedro"));
            Assert.IsTrue(hc.Add("ano.nascimento", 1980, "joao"));

            var retornoGet = hc.Get("ano.nascimento", 0, 0);

            Assert.AreEqual(retornoGet.Count(), 2);
            Assert.AreEqual(retornoGet[0], "joao");
            Assert.AreEqual(retornoGet[1], "pedro");

            var retorno = hc.RetornoApoioTeste();

            Assert.AreEqual(retorno.First().Key, "ano.nascimento");

            var subIndx = retorno.First().Value.First();

            Assert.IsTrue(subIndx.Value.Any(s => s == "pedro"));
            Assert.IsTrue(subIndx.Value.Any(s => s == "joao"));
        }
        public void TesteRetornarIndexElementoComMaisDeUmSubIndice()
        {
            var hc = new HoplonCollection();

            Assert.IsTrue(hc.Add("nomes", 1980, "Carlos"));
            Assert.IsTrue(hc.Add("nomes", 1980, "Willian"));
            Assert.IsTrue(hc.Add("nomes", 1980, "Cristiano"));
            Assert.IsTrue(hc.Add("nomes", 1980, "Cristiano Craujo"));
            Assert.IsTrue(hc.Add("nomes", 1980, "Cristiano Braujo"));
            Assert.IsTrue(hc.Add("nomes", 1980, "Cristiano Araujo"));

            Assert.IsTrue(hc.Add("nomes", 2000, "Fusca"));
            Assert.IsTrue(hc.Add("nomes", 2000, "Gol"));
            Assert.IsTrue(hc.Add("nomes", 2000, "Opala"));

            Assert.IsTrue(hc.Add("nomes", 8885, "Futebol"));
            Assert.IsTrue(hc.Add("nomes", 8885, "gude"));
            Assert.IsTrue(hc.Add("nomes", 8885, "ping pong"));

            Assert.AreEqual(hc.IndexOf("nomes", "Fusca"), 6);
            Assert.AreEqual(hc.IndexOf("nomes", "ping Pong"), 11);
            Assert.AreEqual(hc.IndexOf("nomes", "carlos"), 0);
        }
        public void TestarBuscarRegistrosComEndNegativo()
        {
            var hc = new HoplonCollection();

            Assert.IsTrue(hc.Add("nomes", 1980, "Carlos"));
            Assert.IsTrue(hc.Add("nomes", 1980, "Willian"));
            Assert.IsTrue(hc.Add("nomes", 1980, "Cristiano"));
            Assert.IsTrue(hc.Add("nomes", 1980, "Cristiano Craujo"));
            Assert.IsTrue(hc.Add("nomes", 1980, "Cristiano Braujo"));
            Assert.IsTrue(hc.Add("nomes", 1980, "Cristiano Araujo"));

            var retorno = hc.Get("nomes", 0, -1);

            string[] compare = { "Carlos", "Cristiano", "Cristiano Araujo", "Cristiano Braujo", "Cristiano Craujo", "Willian" };

            Assert.AreEqual(retorno.Count, 6);
            Parallel.For(0, 6, i =>
            {
                Assert.AreEqual(retorno[i], compare[i]);
            });

            // -2
            retorno = hc.Get("nomes", 0, -2);
            Assert.AreEqual(retorno.Count, 5);
            Parallel.For(0, 5, i =>
            {
                Assert.AreEqual(retorno[i], compare[i]);
            });

            // -3
            retorno = hc.Get("nomes", 0, -3);
            Assert.AreEqual(retorno.Count, 4);
            Parallel.For(0, 4, i =>
            {
                Assert.AreEqual(retorno[i], compare[i]);
            });

            // -4
            retorno = hc.Get("nomes", 0, -4);
            Assert.AreEqual(retorno.Count, 3);
            Parallel.For(0, 3, i =>
            {
                Assert.AreEqual(retorno[i], compare[i]);
            });

            // -5
            retorno = hc.Get("nomes", 0, -5);
            Assert.AreEqual(retorno.Count, 2);
            Parallel.For(0, 2, i =>
            {
                Assert.AreEqual(retorno[i], compare[i]);
            });

            // -6
            retorno = hc.Get("nomes", 0, -6);
            Assert.AreEqual(retorno.Count, 1);
            Parallel.For(0, 1, i =>
            {
                Assert.AreEqual(retorno[i], compare[i]);
            });

            // -7
            retorno = hc.Get("nomes", 0, -7);
            Assert.AreEqual(retorno.Count, 0);

            // -8
            retorno = hc.Get("nomes", 0, -8);
            Assert.AreEqual(retorno.Count, 6);
            Parallel.For(0, 6, i =>
            {
                Assert.AreEqual(retorno[i], compare[i]);
            });
        }
        public void TestarOrdenacaoDeSubIndice()
        {
            var hc = new HoplonCollection();

            Assert.IsTrue(hc.Add("nomes", 2001, "Gabriel"));
            Assert.IsTrue(hc.Add("nomes", 2001, "Julia"));
            Assert.IsTrue(hc.Add("nomes", 2001, "Estelio"));
            Assert.IsTrue(hc.Add("nomes", 2001, "Marcos"));
            Assert.IsTrue(hc.Add("nomes", 2001, "Layane"));

            Assert.IsTrue(hc.Add("nomes", 1982, "Ana Julia"));
            Assert.IsTrue(hc.Add("nomes", 1982, "Wagner"));
            Assert.IsTrue(hc.Add("nomes", 1982, "Roberto"));
            Assert.IsTrue(hc.Add("nomes", 1982, "Bruno"));
            Assert.IsTrue(hc.Add("nomes", 1982, "Paulo"));

            Assert.IsTrue(hc.Add("nomes", 1980, "Carlos"));
            Assert.IsTrue(hc.Add("nomes", 1980, "Willian"));
            Assert.IsTrue(hc.Add("nomes", 1980, "Cristiano"));
            Assert.IsTrue(hc.Add("nomes", 1980, "Cristiano Craujo"));
            Assert.IsTrue(hc.Add("nomes", 1980, "Cristiano Braujo"));
            Assert.IsTrue(hc.Add("nomes", 1980, "Cristiano Araujo"));

            Assert.IsTrue(hc.Add("nomes", 1981, "Mercia"));
            Assert.IsTrue(hc.Add("nomes", 1981, "Maria Alves"));
            Assert.IsTrue(hc.Add("nomes", 1981, "Maria Borboleta"));
            Assert.IsTrue(hc.Add("nomes", 1981, "Maria Coró"));
            Assert.IsTrue(hc.Add("nomes", 1981, "Maria Carla"));

            string[] compare1980       = { "Carlos", "Cristiano", "Cristiano Araujo", "Cristiano Braujo", "Cristiano Craujo", "Willian" };
            string[] compare1981       = { "Maria Alves", "Maria Borboleta", "Maria Carla", "Maria Coró", "Mercia" };
            string[] compare1982       = { "Ana Julia", "Bruno", "Paulo", "Roberto", "Wagner" };
            string[] compare2001       = { "Estelio", "Gabriel", "Julia", "Layane", "Marcos" };
            int[]    compareSubIndices = { 1980, 1981, 1982, 2001 };
            string[] compareGet        =
            {
                "Carlos",      "Cristiano",       "Cristiano Araujo", "Cristiano Braujo", "Cristiano Craujo", "Willian",
                "Maria Alves", "Maria Borboleta", "Maria Carla",      "Maria Coró",       "Mercia",
                "Ana Julia",   "Bruno",           "Paulo",            "Roberto",          "Wagner",           "Estelio","Gabriel","Julia", "Layane", "Marcos"
            };

            var retornoGet = hc.Get("nomes", 0, 0);

            Assert.AreEqual(retornoGet.Count(), 21);
            Parallel.For(0, retornoGet.Count, i =>
            {
                Assert.AreEqual(retornoGet[i], compareGet[i]);
            });

            var retorno = hc.RetornoApoioTeste();

            // Qtd de chaves
            Assert.AreEqual(retorno.Count, 1);
            // Qt de subIndices
            Assert.AreEqual(retorno.First().Value.Count, 4);

            // subIndice 1980
            var si1980 = retorno.First().Value.First(s => s.Key == 1980);

            Parallel.For(0, si1980.Value.Count(), i =>
            {
                Assert.AreEqual(si1980.Value[i], compare1980[i]);
            });

            // subIndice 1981
            var si1981 = retorno.First().Value.First(s => s.Key == 1981);

            Parallel.For(0, si1981.Value.Count(), i =>
            {
                Assert.AreEqual(si1981.Value[i], compare1981[i]);
            });

            // subIndice 1982
            var si1982 = retorno.First().Value.First(s => s.Key == 1982);

            Parallel.For(0, si1982.Value.Count(), i =>
            {
                Assert.AreEqual(si1982.Value[i], compare1982[i]);
            });

            // subIndice 2000
            var si2001 = retorno.First().Value.First(s => s.Key == 2001);

            Parallel.For(0, si2001.Value.Count(), i =>
            {
                Assert.AreEqual(si2001.Value[i], compare2001[i]);
            });

            // subIndices
            Parallel.For(0, retorno.First().Value.Count, i =>
            {
                Assert.AreEqual(retorno.First().Value[i].Key, compareSubIndices[i]);
            });
        }
        public void TesteInserirElementosDiferentesMaisSubIndex()
        {
            var hc = new HoplonCollection();

            Assert.IsTrue(hc.Add("ano.nascimento", 1980, "pedro"));
            Assert.IsTrue(hc.Add("ano.nascimento", 1980, "maria"));
            Assert.IsTrue(hc.Add("ano.nascimento", 1980, "joao"));

            Assert.IsTrue(hc.Add("ano.nascimento", 2000, "wagner"));
            Assert.IsTrue(hc.Add("ano.nascimento", 2000, "eros"));
            Assert.IsTrue(hc.Add("ano.nascimento", 2000, "arthur"));

            Assert.IsTrue(hc.Add("ano.nascimento", 2015, "layane"));
            Assert.IsTrue(hc.Add("ano.nascimento", 2015, "lidia"));
            Assert.IsTrue(hc.Add("ano.nascimento", 2015, "pai"));

            Assert.IsTrue(hc.Add("ano.nascimento", 2020, "cachorro"));
            Assert.IsTrue(hc.Add("ano.nascimento", 2020, "ford"));
            Assert.IsTrue(hc.Add("ano.nascimento", 2020, "focus"));

            string[] compare = { "joao", "maria", "pedro", "arthur", "eros", "wagner", "layane", "lidia", "pai", "cachorro", "focus", "ford" };

            var retornoGet = hc.Get("ano.nascimento", 0, 0);

            Assert.AreEqual(retornoGet.Count(), 12);

            Parallel.For(0, retornoGet.Count, i =>
            {
                Assert.AreEqual(retornoGet[i], compare[i]);
            });

            var retorno = hc.RetornoApoioTeste();

            Assert.AreEqual(retorno.First().Key, "ano.nascimento");
            Assert.AreEqual(retorno.First().Value.Count, 4);

            //subIndx 1980
            var si1980 = retorno.First().Value.First(s => s.Key == 1980);

            Assert.AreEqual(si1980.Value.Count, 3);
            Assert.IsTrue(si1980.Value.Any(s => s == "pedro"));
            Assert.IsTrue(si1980.Value.Any(s => s == "joao"));
            Assert.IsTrue(si1980.Value.Any(s => s == "maria"));

            //subIndx 2000
            var si2000 = retorno.First().Value.First(s => s.Key == 2000);

            Assert.AreEqual(si2000.Value.Count, 3);
            Assert.IsTrue(si2000.Value.Any(s => s == "wagner"));
            Assert.IsTrue(si2000.Value.Any(s => s == "eros"));
            Assert.IsTrue(si2000.Value.Any(s => s == "arthur"));

            //subIndx 2015
            var si2015 = retorno.First().Value.First(s => s.Key == 2015);

            Assert.AreEqual(si2015.Value.Count, 3);
            Assert.IsTrue(si2015.Value.Any(s => s == "layane"));
            Assert.IsTrue(si2015.Value.Any(s => s == "lidia"));
            Assert.IsTrue(si2015.Value.Any(s => s == "pai"));

            //subIndx 2020
            var si2020 = retorno.First().Value.First(s => s.Key == 2020);

            Assert.AreEqual(si2020.Value.Count, 3);
            Assert.IsTrue(si2020.Value.Any(s => s == "cachorro"));
            Assert.IsTrue(si2020.Value.Any(s => s == "ford"));
            Assert.IsTrue(si2020.Value.Any(s => s == "focus"));
        }
        public void TesteInserirElementosEmChavesDiferentesComSubIndexDiferentes()
        {
            var hc = new HoplonCollection();

            Assert.IsTrue(hc.Add("ano.nascimento", 1980, "pedro"));
            Assert.IsTrue(hc.Add("ano.nascimento", 1981, "maria"));
            Assert.IsTrue(hc.Add("ano.nascimento", 1982, "joao"));

            Assert.IsTrue(hc.Add("cidades", 2000, "anapolis"));
            Assert.IsTrue(hc.Add("cidades", 2001, "goiania"));
            Assert.IsTrue(hc.Add("cidades", 2002, "florianopolis"));

            Assert.IsTrue(hc.Add("carros", 8000, "focus"));
            Assert.IsTrue(hc.Add("carros", 8001, "mustang"));
            Assert.IsTrue(hc.Add("carros", 8002, "fusion"));

            Assert.IsTrue(hc.Add("jogos", 5000, "basquete"));
            Assert.IsTrue(hc.Add("jogos", 5001, "futebol"));
            Assert.IsTrue(hc.Add("jogos", 5002, "voley"));

            var retornoGet = hc.Get("ano.nascimento", 0, 0);

            Assert.AreEqual(retornoGet.Count(), 3);
            Assert.AreEqual(retornoGet[0], "pedro"); // 80
            Assert.AreEqual(retornoGet[1], "maria"); // 81
            Assert.AreEqual(retornoGet[2], "joao");  // 82

            retornoGet = hc.Get("cidades", 0, 0);
            Assert.AreEqual(retornoGet.Count(), 3);
            Assert.AreEqual(retornoGet[0], "anapolis");      // 00
            Assert.AreEqual(retornoGet[1], "goiania");       // 01
            Assert.AreEqual(retornoGet[2], "florianopolis"); // 02

            retornoGet = hc.Get("carros", 0, 0);
            Assert.AreEqual(retornoGet.Count(), 3);
            Assert.AreEqual(retornoGet[0], "focus");
            Assert.AreEqual(retornoGet[1], "mustang");
            Assert.AreEqual(retornoGet[2], "fusion");

            retornoGet = hc.Get("jogos", 0, 0);
            Assert.AreEqual(retornoGet.Count(), 3);
            Assert.AreEqual(retornoGet[0], "basquete");
            Assert.AreEqual(retornoGet[1], "futebol");
            Assert.AreEqual(retornoGet[2], "voley");

            var retorno = hc.RetornoApoioTeste();

            // Qtd de chaves
            Assert.AreEqual(retorno.Count, 4);

            // Chave ano.nasc
            var anoNasc = retorno.First(s => s.Key == "ano.nascimento");

            Assert.AreEqual(anoNasc.Value.Count, 3);
            Assert.IsTrue(anoNasc.Value.Any(s => s.Key == 1980));
            Assert.IsTrue(anoNasc.Value.Any(s => s.Key == 1981));
            Assert.IsTrue(anoNasc.Value.Any(s => s.Key == 1982));

            // nenhum diferente destes 3.
            Assert.AreEqual(anoNasc.Value.Count(s => s.Key != 1980 && s.Key != 1981 && s.Key != 1982), 0);

            // verifica o valor de cada subIndice.
            Assert.AreEqual(anoNasc.Value.First(s => s.Key == 1980).Value.First(), "pedro");
            Assert.AreEqual(anoNasc.Value.First(s => s.Key == 1981).Value.First(), "maria");
            Assert.AreEqual(anoNasc.Value.First(s => s.Key == 1982).Value.First(), "joao");

            // verifica que cada subIndice tem apenas um valor
            Assert.AreEqual(anoNasc.Value.First(s => s.Key == 1980).Value.Count, 1);
            Assert.AreEqual(anoNasc.Value.First(s => s.Key == 1981).Value.Count, 1);
            Assert.AreEqual(anoNasc.Value.First(s => s.Key == 1982).Value.Count, 1);

            // Chave cidades
            var cidades = retorno.First(s => s.Key == "cidades");

            Assert.AreEqual(cidades.Value.Count, 3); // Apenas um subIndice
            Assert.IsTrue(cidades.Value.Any(s => s.Key == 2000));
            Assert.IsTrue(cidades.Value.Any(s => s.Key == 2001));
            Assert.IsTrue(cidades.Value.Any(s => s.Key == 2002));

            // nenhum diferente destes 3.
            Assert.AreEqual(cidades.Value.Count(s => s.Key != 2000 && s.Key != 2001 && s.Key != 2002), 0);

            // verifica o valor de cada subIndice.
            Assert.AreEqual(cidades.Value.First(s => s.Key == 2000).Value.First(), "anapolis");
            Assert.AreEqual(cidades.Value.First(s => s.Key == 2001).Value.First(), "goiania");
            Assert.AreEqual(cidades.Value.First(s => s.Key == 2002).Value.First(), "florianopolis");

            // verifica que cada subIndice tem apenas um valor
            Assert.AreEqual(cidades.Value.First(s => s.Key == 2000).Value.Count, 1);
            Assert.AreEqual(cidades.Value.First(s => s.Key == 2001).Value.Count, 1);
            Assert.AreEqual(cidades.Value.First(s => s.Key == 2002).Value.Count, 1);

            // Chave carros
            var carros = retorno.First(s => s.Key == "carros");

            Assert.AreEqual(carros.Value.Count, 3); // Apenas um subIndice
            Assert.IsTrue(carros.Value.Any(s => s.Key == 8000));
            Assert.IsTrue(carros.Value.Any(s => s.Key == 8001));
            Assert.IsTrue(carros.Value.Any(s => s.Key == 8002));

            // nenhum diferente destes 3.
            Assert.AreEqual(carros.Value.Count(s => s.Key != 8000 && s.Key != 8001 && s.Key != 8002), 0);

            // verifica o valor de cada subIndice.
            Assert.AreEqual(carros.Value.First(s => s.Key == 8000).Value.First(), "focus");
            Assert.AreEqual(carros.Value.First(s => s.Key == 8001).Value.First(), "mustang");
            Assert.AreEqual(carros.Value.First(s => s.Key == 8002).Value.First(), "fusion");

            // verifica que cada subIndice tem apenas um valor
            Assert.AreEqual(carros.Value.First(s => s.Key == 8000).Value.Count, 1);
            Assert.AreEqual(carros.Value.First(s => s.Key == 8001).Value.Count, 1);
            Assert.AreEqual(carros.Value.First(s => s.Key == 8002).Value.Count, 1);

            // Chave jogos
            var jogos = retorno.First(s => s.Key == "jogos");

            Assert.AreEqual(jogos.Value.Count, 3); // Apenas um subIndice
            Assert.IsTrue(jogos.Value.Any(s => s.Key == 5000));
            Assert.IsTrue(jogos.Value.Any(s => s.Key == 5001));
            Assert.IsTrue(jogos.Value.Any(s => s.Key == 5002));

            // nenhum diferente destes 3.
            Assert.AreEqual(jogos.Value.Count(s => s.Key != 5000 && s.Key != 5001 && s.Key != 5002), 0);

            // verifica o valor de cada subIndice.
            Assert.AreEqual(jogos.Value.First(s => s.Key == 5000).Value.First(), "basquete");
            Assert.AreEqual(jogos.Value.First(s => s.Key == 5001).Value.First(), "futebol");
            Assert.AreEqual(jogos.Value.First(s => s.Key == 5002).Value.First(), "voley");

            // verifica que cada subIndice tem apenas um valor
            Assert.AreEqual(jogos.Value.First(s => s.Key == 5000).Value.Count, 1);
            Assert.AreEqual(jogos.Value.First(s => s.Key == 5001).Value.Count, 1);
            Assert.AreEqual(jogos.Value.First(s => s.Key == 5002).Value.Count, 1);
        }