﻿/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.
 */
using System.Collections.Generic;
using DotCMIS.Client;
using DotCMIS.Client.Impl;
using NUnit.Framework;

namespace DotCMISUnitTest
{
    [TestFixture]
    class EnumeratorTest
    {
        private const int PageSize = 12;

        private IList<int> source;
        private IItemEnumerable<int> testEnumerable;

        [SetUp]
        public void Init()
        {
            source = new List<int>();
            for (int i = 0; i < 100; i++)
            {
                source.Add(i);
            }

            PageFetcher<int>.FetchPage fetchPageDelegate = delegate(long maxNumItems, long skipCount)
            {
                IList<int> page = new List<int>();

                for (int i = (int)skipCount; i < skipCount + maxNumItems; i++)
                {
                    if (source.Count <= i) { break; }
                    page.Add(source[i]);
                }

                return new PageFetcher<int>.Page<int>(page, source.Count, skipCount + maxNumItems < source.Count);
            };

            testEnumerable = new CollectionEnumerable<int>(new PageFetcher<int>(PageSize, fetchPageDelegate));
        }

        [Test]
        public void TestIteration()
        {
            Assert.AreEqual(source.Count, testEnumerable.TotalNumItems);
            Assert.AreEqual(PageSize, testEnumerable.PageNumItems);

            int i = 0;
            foreach (int x in testEnumerable)
            {
                Assert.AreEqual(i, x);
                i++;
            }
        }

        [Test]
        public void TestSkip()
        {
            int i = 42;
            foreach (int x in testEnumerable.SkipTo(42))
            {
                Assert.AreEqual(i, x);
                i++;
            }

            Assert.AreEqual(source.Count, i);
        }

        [Test]
        public void TestOverSkip()
        {
            foreach (int x in testEnumerable.SkipTo(source.Count + 1))
            {
                Assert.Fail();
            }
        }

        [Test]
        public void TestPage()
        {
            int i = 0;
            foreach (int x in testEnumerable.GetPage(8))
            {
                Assert.AreEqual(i, x);
                i++;
            }

            Assert.AreEqual(8, i);
        }

        [Test]
        public void TestBigPage()
        {
            int i = 0;
            foreach (int x in testEnumerable.GetPage(source.Count * 2))
            {
                Assert.AreEqual(i, x);
                i++;
            }

            Assert.AreEqual(source.Count, i);
        }

        [Test]
        public void TestSkipAndPage()
        {
            int i = 42;
            foreach (int x in testEnumerable.SkipTo(42).GetPage(20))
            {
                Assert.AreEqual(i, x);
                i++;
            }

            Assert.AreEqual(62, i);
        }
    }
}
