more tests for improved coverage

This commit is contained in:
Christian Köllner 2020-03-01 17:56:14 +01:00
parent 6a87cb7dac
commit 89a9e7b5ac
5 changed files with 72 additions and 41 deletions

View File

@ -1,4 +1,7 @@
using Microsoft.VisualStudio.TestTools.UnitTesting; using Capnproto_test.Capnp.Test;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System;
using System.Linq;
namespace Capnp.Net.Runtime.Tests namespace Capnp.Net.Runtime.Tests
{ {
@ -354,5 +357,40 @@ namespace Capnp.Net.Runtime.Tests
Assert.AreEqual(double.NegativeInfinity, asListOfDoubles[0]); Assert.AreEqual(double.NegativeInfinity, asListOfDoubles[0]);
Assert.AreEqual(double.MaxValue, asListOfDoubles[1]); Assert.AreEqual(double.MaxValue, asListOfDoubles[1]);
} }
[TestMethod]
public void NestedLists()
{
var expected = new int[][] {
new int[] { 1, 2, 3 },
new int[] { 4, 5 },
new int[] { 6 } };
var b = MessageBuilder.Create();
var dss = b.CreateObject<DynamicSerializerState>();
dss.SetObject(expected);
DeserializerState d = dss;
var ld = d.RequireList();
var result = ld.Cast2D<int>();
Assert.AreEqual(3, result.Count);
for (int i = 0; i < result.Count; i++)
{
CollectionAssert.AreEqual(expected[i], result[i].ToArray());
}
Assert.ThrowsException<NotSupportedException>(() => ld.Cast2D<decimal>());
}
[TestMethod]
public void LinearListWrongUse()
{
var b = MessageBuilder.Create();
var dss = b.CreateObject<DynamicSerializerState>();
dss.SetObject(new int[] { 1, 2, 3 });
DeserializerState d = dss;
var ld = d.RequireList();
Assert.ThrowsException<NotSupportedException>(() => ld.CastList());
Assert.ThrowsException<NotSupportedException>(() => ld.CastCapList<ITestInterface>());
}
} }
} }

View File

@ -79,6 +79,8 @@ namespace Capnp.Net.Runtime.Tests
Assert.ThrowsException<InvalidOperationException>(() => { list[0] = null; }); Assert.ThrowsException<InvalidOperationException>(() => { list[0] = null; });
list.Init(5); list.Init(5);
Assert.ThrowsException<InvalidOperationException>(() => list.Init(1)); Assert.ThrowsException<InvalidOperationException>(() => list.Init(1));
Assert.ThrowsException<IndexOutOfRangeException>(() => { var _ = list[5]; });
Assert.ThrowsException<IndexOutOfRangeException>(() => { list[-1] = null; });
var c1 = new Counters(); var c1 = new Counters();
var cap1 = new TestInterfaceImpl(c1); var cap1 = new TestInterfaceImpl(c1);
var c2 = new Counters(); var c2 = new Counters();
@ -152,6 +154,8 @@ namespace Capnp.Net.Runtime.Tests
list.Init(7); list.Init(7);
Assert.ThrowsException<InvalidOperationException>(() => list.Init(1)); Assert.ThrowsException<InvalidOperationException>(() => list.Init(1));
Assert.AreEqual(7, list.Count); Assert.AreEqual(7, list.Count);
Assert.ThrowsException<IndexOutOfRangeException>(() => { var _ = list[-1]; });
Assert.ThrowsException<IndexOutOfRangeException>(() => { list[7] = null; });
var c1 = new Counters(); var c1 = new Counters();
var cap1 = new TestInterfaceImpl(c1); var cap1 = new TestInterfaceImpl(c1);
var obj1 = b.CreateObject<DynamicSerializerState>(); var obj1 = b.CreateObject<DynamicSerializerState>();
@ -234,6 +238,7 @@ namespace Capnp.Net.Runtime.Tests
list.Init(4); list.Init(4);
Assert.ThrowsException<InvalidOperationException>(() => list.Init(1)); Assert.ThrowsException<InvalidOperationException>(() => list.Init(1));
Assert.AreEqual(4, list.Count); Assert.AreEqual(4, list.Count);
Assert.ThrowsException<IndexOutOfRangeException>(() => { var _ = list[5]; });
list[0].SomeText = "0"; list[0].SomeText = "0";
list[1].SomeText = "1"; list[1].SomeText = "1";
list[2].SomeText = "2"; list[2].SomeText = "2";
@ -265,6 +270,8 @@ namespace Capnp.Net.Runtime.Tests
list.Init(4); list.Init(4);
Assert.ThrowsException<InvalidOperationException>(() => list.Init(1)); Assert.ThrowsException<InvalidOperationException>(() => list.Init(1));
Assert.AreEqual(4, list.Count); Assert.AreEqual(4, list.Count);
Assert.ThrowsException<IndexOutOfRangeException>(() => { var _ = list[5]; });
Assert.ThrowsException<IndexOutOfRangeException>(() => { list[-1] = null; });
list[0] = "0"; list[0] = "0";
list[2] = null; list[2] = null;
list[3] = "3"; list[3] = "3";
@ -724,5 +731,15 @@ namespace Capnp.Net.Runtime.Tests
DeserializerState d2 = dss; DeserializerState d2 = dss;
CollectionAssert.AreEqual(expected, d2.RequireList().CastText2().ToArray()); CollectionAssert.AreEqual(expected, d2.RequireList().CastText2().ToArray());
} }
[TestMethod]
public void EmptyListContract()
{
var list = new EmptyList<string>();
Assert.AreEqual(0, list.Count);
Assert.ThrowsException<IndexOutOfRangeException>(() => { var _ = list[-1]; });
Assert.ThrowsException<IndexOutOfRangeException>(() => { var _ = list[0]; });
Assert.AreEqual(0, list.ToArray().Length);
}
} }
} }

View File

@ -8,14 +8,14 @@ namespace Capnp
/// <summary> /// <summary>
/// Implements an empty <see cref="IReadOnlyList{T}"/>. /// Implements an empty <see cref="IReadOnlyList{T}"/>.
/// </summary> /// </summary>
/// <typeparam name="T"></typeparam> /// <typeparam name="T">list element type</typeparam>
public class EmptyList<T> : IReadOnlyList<T> public class EmptyList<T> : IReadOnlyList<T>
{ {
/// <summary> /// <summary>
/// Always throws an <see cref="ArgumentOutOfRangeException"/>. /// Always throws an <see cref="IndexOutOfRangeException"/>.
/// </summary> /// </summary>
/// <param name="index">Ignored</param> /// <param name="index">Ignored</param>
public T this[int index] => throw new ArgumentOutOfRangeException(nameof(index)); public T this[int index] => throw new IndexOutOfRangeException(nameof(index));
/// <summary> /// <summary>
/// Always 0. /// Always 0.

View File

@ -11,6 +11,9 @@ namespace Capnp
static class GenericCasts<T> static class GenericCasts<T>
{ {
public static Func<ListDeserializer, T>? CastFunc; public static Func<ListDeserializer, T>? CastFunc;
public static Func<ListDeserializer, T> GetCastFunc() => CastFunc ??
throw new NotSupportedException("Requested cast is not supported");
} }
static ListDeserializer() static ListDeserializer()
@ -45,12 +48,7 @@ namespace Capnp
T Cast<T>() T Cast<T>()
{ {
var func = GenericCasts<T>.CastFunc; return GenericCasts<T>.GetCastFunc()(this);
if (func == null)
throw new NotSupportedException("Requested cast is not supported");
return func(this);
} }
/// <summary> /// <summary>
@ -91,7 +89,7 @@ namespace Capnp
/// <exception cref="Rpc.InvalidCapabilityInterfaceException">If <typeparamref name="T"/> does not qualify as capability interface.</exception> /// <exception cref="Rpc.InvalidCapabilityInterfaceException">If <typeparamref name="T"/> does not qualify as capability interface.</exception>
public virtual IReadOnlyList<T> CastCapList<T>() where T: class public virtual IReadOnlyList<T> CastCapList<T>() where T: class
{ {
throw new NotSupportedException("This kind of list does not contain nested lists"); throw new NotSupportedException("This kind of list cannot be represented as list of capabilities");
} }
object CastND(int n, Func<ListDeserializer, object> func) object CastND(int n, Func<ListDeserializer, object> func)
@ -158,6 +156,7 @@ namespace Capnp
/// <exception cref="NotSupportedException">If this list cannot be represented in the desired manner.</exception> /// <exception cref="NotSupportedException">If this list cannot be represented in the desired manner.</exception>
public IReadOnlyList<IReadOnlyList<T>> Cast2D<T>() public IReadOnlyList<IReadOnlyList<T>> Cast2D<T>()
{ {
GenericCasts<IReadOnlyList<T>>.GetCastFunc(); // Probe to avoid lazy NotSupportedException
return CastList().LazyListSelect(ld => ld.Cast<IReadOnlyList<T>>()); return CastList().LazyListSelect(ld => ld.Cast<IReadOnlyList<T>>());
} }

View File

@ -11,35 +11,6 @@ namespace Capnp
/// </summary> /// </summary>
public class ListOfBitsSerializer: SerializerState, IReadOnlyList<bool> public class ListOfBitsSerializer: SerializerState, IReadOnlyList<bool>
{ {
class Enumerator : IEnumerator<bool>
{
readonly ListOfBitsSerializer _self;
int _pos = -1;
public Enumerator(ListOfBitsSerializer self)
{
_self = self;
}
public bool Current => _pos >= 0 && _pos < _self.Count ? _self[_pos] : false;
object IEnumerator.Current => Current;
public void Dispose()
{
}
public bool MoveNext()
{
return ++_pos < _self.Count;
}
public void Reset()
{
_pos = -1;
}
}
/// <summary> /// <summary>
/// Gets or sets the element at given index. /// Gets or sets the element at given index.
/// </summary> /// </summary>
@ -121,10 +92,16 @@ namespace Capnp
} }
} }
IEnumerable<bool> Enumerate()
{
for (int i = 0; i < Count; i++)
yield return this[i];
}
/// <summary> /// <summary>
/// Implements <see cref="IEnumerable{Boolean}"/> /// Implements <see cref="IEnumerable{Boolean}"/>
/// </summary> /// </summary>
public IEnumerator<bool> GetEnumerator() => new Enumerator(this); public IEnumerator<bool> GetEnumerator() => Enumerate().GetEnumerator();
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
} }