blob: 2faed9318a928dcd897f2674405c4462ee69463b [file] [log] [blame]
/*
* 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.
*/
// ReSharper disable NonReadonlyMemberInGetHashCode
namespace Apache.Ignite.Core.Tests.Binary
{
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using NUnit.Framework;
/// <summary>
/// Tests binary type interoperability between .NET and Java code.
/// </summary>
public class JavaBinaryInteropTest
{
/// <summary>
/// Tests that all kinds of values from .NET can be handled properly on Java side.
/// </summary>
[Test]
public void TestValueRoundtrip()
{
using (var ignite = Ignition.Start(TestUtils.GetTestConfiguration()))
{
ignite.CreateCache<int, object>("default");
// Basic types.
// Types which map directly to Java are returned properly when retrieved as object.
// Non-directly mapped types are returned as their counterpart.
CheckValueCaching((char) 128);
CheckValueCaching((byte) 255);
CheckValueCaching((sbyte) -10, false);
CheckValueCaching((short) -32000);
CheckValueCaching((ushort) 65350, false);
CheckValueCaching(int.MinValue);
CheckValueCaching(uint.MaxValue, false);
CheckValueCaching(long.MinValue);
CheckValueCaching(ulong.MaxValue, false);
CheckValueCaching((float) 1.1);
CheckValueCaching(2.2);
CheckValueCaching((decimal) 3.3, asArray: false);
CheckValueCaching(Guid.NewGuid(), asArray: false);
CheckValueCaching(DateTime.Now, asArray: false);
CheckValueCaching("foobar");
// Special arrays.
CheckValueCaching(new[] {Guid.Empty, Guid.NewGuid()}, false);
CheckValueCaching(new Guid?[] {Guid.Empty, Guid.NewGuid()});
CheckValueCaching(new[] {1.2m, -3.4m}, false);
CheckValueCaching(new decimal?[] {1.2m, -3.4m});
CheckValueCaching(new[] {DateTime.Now}, false);
// Custom types.
CheckValueCaching(new Foo {X = 10}, asArray: false);
CheckValueCaching(new Bar {X = 20}, asArray: false);
// Collections.
CheckValueCaching(new List<Foo>(GetFoo()));
CheckValueCaching(new List<Bar>(GetBar()));
CheckValueCaching(new HashSet<Foo>(GetFoo()));
CheckValueCaching(new HashSet<Bar>(GetBar()));
CheckValueCaching(GetFoo().ToDictionary(x => x.X, x => x));
CheckValueCaching(GetBar().ToDictionary(x => x.X, x => x));
// Custom type arrays.
// Array type is lost, because in binary mode on Java side we receive the value as Object[].
CheckValueCaching(new[] {new Foo {X = -1}, new Foo {X = 1}}, false);
CheckValueCaching(new[] {new Bar {X = -10}, new Bar {X = 10}}, false);
}
}
/// <summary>
/// Checks caching of a value with generic cache.
/// </summary>
private static void CheckValueCaching<T>(T val, bool asObject = true, bool asArray = true)
{
var cache = Ignition.GetIgnite().GetCache<int, T>("default");
cache[1] = val;
Assert.AreEqual(val, cache[1]);
if (asObject)
{
CheckValueCachingAsObject(val);
}
// Array of T
if (asArray && !(val is IEnumerable))
{
CheckValueCaching(new[] {val}, asObject, false);
}
}
/// <summary>
/// Checks caching of a value with object cache.
/// </summary>
private static void CheckValueCachingAsObject<T>(T val)
{
var cache = Ignition.GetIgnite().GetCache<int, object>("default");
cache[1] = val;
Assert.AreEqual(val, (T) cache[1]);
}
/// <summary>
/// Gets Foo collection.
/// </summary>
private static IEnumerable<Foo> GetFoo()
{
return Enumerable.Range(-50, 100).Select(x => new Foo {X = x});
}
/// <summary>
/// Gets Bar collection.
/// </summary>
private static IEnumerable<Bar> GetBar()
{
return Enumerable.Range(-50, 100).Select(x => new Bar {X = x});
}
/// <summary>
/// Test custom class.
/// </summary>
private class Foo
{
public int X { get; set; }
public override bool Equals(object obj)
{
if (ReferenceEquals(null, obj)) return false;
if (ReferenceEquals(this, obj)) return true;
if (obj.GetType() != GetType()) return false;
return X == ((Foo) obj).X;
}
public override int GetHashCode()
{
return X;
}
}
/// <summary>
/// Test custom struct.
/// </summary>
private struct Bar
{
public int X { get; set; }
public override bool Equals(object obj)
{
if (ReferenceEquals(null, obj)) return false;
return obj is Bar && X == ((Bar) obj).X;
}
public override int GetHashCode()
{
return X;
}
}
}
}