Jo Shields a575963da9 Imported Upstream version 3.6.0
Former-commit-id: da6be194a6b1221998fc28233f2503bd61dd9d14
2014-08-13 10:39:27 +01:00

236 lines
14 KiB
C#

// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
namespace System.Data.Entity.SqlServer
{
using System.Data.Entity.Spatial;
using System.Data.Entity.SqlServer.Resources;
using System.IO;
using System.Reflection;
using System.Runtime.Serialization.Formatters.Binary;
using Moq;
using Xunit;
public class SqlSpatialServicesTests
{
[Fact]
public void Public_members_check_for_null_arguments()
{
TestNullArgument("geographyValue", s => s.GetCoordinateSystemId((DbGeography)null));
TestNullArgument("geographyValue", s => s.GetSpatialTypeName((DbGeography)null));
TestNullArgument("geographyValue", s => s.GetDimension((DbGeography)null));
TestNullArgument("geographyValue", s => s.AsBinary((DbGeography)null));
TestNullArgument("geographyValue", s => s.AsGml((DbGeography)null));
TestNullArgument("geographyValue", s => s.AsText((DbGeography)null));
TestNullArgument("geographyValue", s => s.GetIsEmpty((DbGeography)null));
TestNullArgument("geographyValue", s => s.SpatialEquals(null, new DbGeography()));
TestNullArgument("geographyValue", s => s.Disjoint(null, new DbGeography()));
TestNullArgument("geographyValue", s => s.Intersects(null, new DbGeography()));
TestNullArgument("geographyValue", s => s.Buffer((DbGeography)null, 0.0));
TestNullArgument("geographyValue", s => s.Distance(null, new DbGeography()));
TestNullArgument("geographyValue", s => s.Intersection(null, new DbGeography()));
TestNullArgument("geographyValue", s => s.Union(null, new DbGeography()));
TestNullArgument("geographyValue", s => s.Difference(null, new DbGeography()));
TestNullArgument("geographyValue", s => s.SymmetricDifference(null, new DbGeography()));
TestNullArgument("geographyValue", s => s.GetElementCount((DbGeography)null));
TestNullArgument("geographyValue", s => s.ElementAt((DbGeography)null, 1));
TestNullArgument("geographyValue", s => s.GetLatitude(null));
TestNullArgument("geographyValue", s => s.GetLongitude(null));
TestNullArgument("geographyValue", s => s.GetElevation((DbGeography)null));
TestNullArgument("geographyValue", s => s.GetMeasure((DbGeography)null));
TestNullArgument("geographyValue", s => s.GetLength((DbGeography)null));
TestNullArgument("geographyValue", s => s.GetStartPoint((DbGeography)null));
TestNullArgument("geographyValue", s => s.GetEndPoint((DbGeography)null));
TestNullArgument("geographyValue", s => s.GetIsClosed((DbGeography)null));
TestNullArgument("geographyValue", s => s.GetPointCount((DbGeography)null));
TestNullArgument("geographyValue", s => s.PointAt((DbGeography)null, 1));
TestNullArgument("geographyValue", s => s.GetArea((DbGeography)null));
TestNullArgument("geometryValue", s => s.GetCoordinateSystemId((DbGeometry)null));
TestNullArgument("geometryValue", s => s.GetSpatialTypeName((DbGeometry)null));
TestNullArgument("geometryValue", s => s.GetDimension((DbGeometry)null));
TestNullArgument("geometryValue", s => s.GetEnvelope(null));
TestNullArgument("geometryValue", s => s.AsBinary((DbGeometry)null));
TestNullArgument("geometryValue", s => s.AsGml((DbGeometry)null));
TestNullArgument("geometryValue", s => s.AsText((DbGeometry)null));
TestNullArgument("geometryValue", s => s.GetIsEmpty((DbGeometry)null));
TestNullArgument("geometryValue", s => s.GetIsSimple(null));
TestNullArgument("geometryValue", s => s.GetBoundary(null));
TestNullArgument("geometryValue", s => s.GetIsValid(null));
TestNullArgument("geometryValue", s => s.SpatialEquals(null, new DbGeometry()));
TestNullArgument("geometryValue", s => s.Disjoint(null, new DbGeometry()));
TestNullArgument("geometryValue", s => s.Intersects(null, new DbGeometry()));
TestNullArgument("geometryValue", s => s.Touches(null, new DbGeometry()));
TestNullArgument("geometryValue", s => s.Crosses(null, new DbGeometry()));
TestNullArgument("geometryValue", s => s.Within(null, new DbGeometry()));
TestNullArgument("geometryValue", s => s.Contains(null, new DbGeometry()));
TestNullArgument("geometryValue", s => s.Overlaps(null, new DbGeometry()));
TestNullArgument("geometryValue", s => s.Relate(null, new DbGeometry(), "Foo"));
TestNullArgument("geometryValue", s => s.Buffer((DbGeometry)null, 0.0));
TestNullArgument("geometryValue", s => s.Distance(null, new DbGeometry()));
TestNullArgument("geometryValue", s => s.GetConvexHull(null));
TestNullArgument("geometryValue", s => s.Intersection(null, new DbGeometry()));
TestNullArgument("geometryValue", s => s.Union(null, new DbGeometry()));
TestNullArgument("geometryValue", s => s.Difference(null, new DbGeometry()));
TestNullArgument("geometryValue", s => s.SymmetricDifference(null, new DbGeometry()));
TestNullArgument("geometryValue", s => s.GetElementCount((DbGeometry)null));
TestNullArgument("geometryValue", s => s.ElementAt((DbGeometry)null, 1));
TestNullArgument("geometryValue", s => s.GetXCoordinate(null));
TestNullArgument("geometryValue", s => s.GetYCoordinate(null));
TestNullArgument("geometryValue", s => s.GetElevation((DbGeometry)null));
TestNullArgument("geometryValue", s => s.GetMeasure((DbGeometry)null));
TestNullArgument("geometryValue", s => s.GetLength((DbGeometry)null));
TestNullArgument("geometryValue", s => s.GetStartPoint((DbGeometry)null));
TestNullArgument("geometryValue", s => s.GetEndPoint((DbGeometry)null));
TestNullArgument("geometryValue", s => s.GetIsClosed((DbGeometry)null));
TestNullArgument("geometryValue", s => s.GetIsRing(null));
TestNullArgument("geometryValue", s => s.GetPointCount((DbGeometry)null));
TestNullArgument("geometryValue", s => s.PointAt((DbGeometry)null, 1));
TestNullArgument("geometryValue", s => s.GetArea((DbGeometry)null));
TestNullArgument("geometryValue", s => s.GetCentroid(null));
TestNullArgument("geometryValue", s => s.GetPointOnSurface(null));
TestNullArgument("geometryValue", s => s.GetExteriorRing(null));
TestNullArgument("geometryValue", s => s.GetInteriorRingCount(null));
TestNullArgument("geometryValue", s => s.InteriorRingAt(null, 1));
TestNullArgument("wellKnownValue", s => s.CreateProviderValue((DbGeographyWellKnownValue)null));
TestNullArgument("wellKnownValue", s => s.CreateProviderValue((DbGeometryWellKnownValue)null));
TestNullArgument("geographyValue", s => s.CreateWellKnownValue((DbGeography)null));
TestNullArgument("geometryValue", s => s.CreateWellKnownValue((DbGeometry)null));
TestNullArgument("providerValue", s => s.GeographyFromProviderValue(null));
TestNullArgument("providerValue", s => s.GeometryFromProviderValue(null));
}
private void TestNullArgument(string parameterName, Action<SqlSpatialServices> test)
{
Assert.Equal(parameterName, Assert.Throws<ArgumentNullException>(() => test(new SqlSpatialServices())).ParamName);
}
[Fact]
public void GeographyFromProviderValue_returns_null_for_null_value()
{
var nullSqlGeography = new SqlTypesAssemblyLoader().GetSqlTypesAssembly().SqlGeographyType
.GetProperty(
"Null",
BindingFlags.Static | BindingFlags.Public | BindingFlags.GetProperty);
var convertedDbGeography = SqlSpatialServices.Instance.GeographyFromProviderValue(nullSqlGeography.GetValue(null, null));
Assert.Same(null, convertedDbGeography);
}
[Fact]
public void GeographyFromProviderValue_returns_DbGeography_for_non_null_value()
{
var dbGeography = DbGeography.FromText("POINT (90 50)");
var sqlGeography = new SqlTypesAssemblyLoader().GetSqlTypesAssembly().ConvertToSqlTypesGeography(dbGeography);
var convertedDbGeography = SqlSpatialServices.Instance.GeographyFromProviderValue(sqlGeography);
Assert.Equal(dbGeography.ProviderValue, convertedDbGeography.ProviderValue);
Assert.Equal(dbGeography.CoordinateSystemId, convertedDbGeography.CoordinateSystemId);
}
[Fact]
public void GeometryFromProviderValue_returns_null_for_null_value()
{
var nullSqlGeometry = new SqlTypesAssemblyLoader().GetSqlTypesAssembly().SqlGeometryType
.GetProperty(
"Null",
BindingFlags.Static | BindingFlags.Public | BindingFlags.GetProperty);
var convertedDbGeometry = SqlSpatialServices.Instance.GeometryFromProviderValue(nullSqlGeometry.GetValue(null, null));
Assert.Same(null, convertedDbGeometry);
}
[Fact]
public void GeometryFromProviderValue_returns_DbGeometry_for_non_null_value()
{
var dbGeometry = DbGeometry.FromText("POINT (90 50)");
var sqlGeometry = new SqlTypesAssemblyLoader().GetSqlTypesAssembly().ConvertToSqlTypesGeometry(dbGeometry);
var convertedDbGeometry = SqlSpatialServices.Instance.GeometryFromProviderValue(sqlGeometry);
Assert.Equal(dbGeometry.ProviderValue, convertedDbGeometry.ProviderValue);
Assert.Equal(dbGeometry.CoordinateSystemId, convertedDbGeometry.CoordinateSystemId);
}
[Fact]
public void SqlSpatialServices_Singleton_uses_SQL_2008_types_on_dev_machine()
{
Assert.Equal(
"Microsoft.SqlServer.Types.SqlGeometry, Microsoft.SqlServer.Types, Version=11.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91",
SqlSpatialServices.Instance.GeometryFromText("POINT (90 50)").ProviderValue.GetType().AssemblyQualifiedName);
}
[Fact]
public void SqlSpatialServices_does_not_throw_until_attempt_is_made_to_use_missing_SQL_types_assembly()
{
var services = new SqlSpatialServices(new SqlTypesAssemblyLoader(new[] { "SomeMissingAssembly" }));
Assert.Equal(
Strings.SqlProvider_SqlTypesAssemblyNotFound,
Assert.Throws<InvalidOperationException>(
() => services.GeometryFromText("POINT (90 50)")).Message);
}
[Fact]
public void NativeTypesAvailable_returns_true_on_dev_machine_with_SQL_native_types_installed()
{
Assert.True(SqlSpatialServices.Instance.NativeTypesAvailable);
}
[Fact]
public void NativeTypesAvailable_returns_true_if_loader_finds_native_types()
{
var mockLoader = new Mock<SqlTypesAssemblyLoader>(null);
mockLoader.Setup(m => m.TryGetSqlTypesAssembly()).Returns(new Mock<SqlTypesAssembly>().Object);
Assert.True(new SqlSpatialServices(mockLoader.Object).NativeTypesAvailable);
}
[Fact]
public void NativeTypesAvailable_returns_false_if_loader_does_not_find_native_types()
{
Assert.False(new SqlSpatialServices(new Mock<SqlTypesAssemblyLoader>(null).Object).NativeTypesAvailable);
}
[Fact]
public void SqlTypes_returns_default_SQL_types_assembly_on_dev_machine()
{
Assert.Same(SqlSpatialServices.Instance.SqlTypes, SqlTypesAssemblyLoader.DefaultInstance.GetSqlTypesAssembly());
}
[Fact]
public void SqlTypes_returns_assembly_from_loader()
{
var mockLoader = new Mock<SqlTypesAssemblyLoader>(null);
var sqlTypesAssembly = new Mock<SqlTypesAssembly>().Object;
mockLoader.Setup(m => m.GetSqlTypesAssembly()).Returns(sqlTypesAssembly);
Assert.Same(sqlTypesAssembly, new SqlSpatialServices(mockLoader.Object).SqlTypes);
}
[Fact]
public void SqlSpatialServices_can_be_serialized()
{
var formatter = new BinaryFormatter();
using (var stream = new MemoryStream())
{
formatter.Serialize(stream, SqlSpatialServices.Instance);
stream.Seek(0, SeekOrigin.Begin);
var deserialized = (SqlSpatialServices)formatter.Deserialize(stream);
var geometry = deserialized.GeometryFromText("POINT (90 50)");
Assert.Equal(90, geometry.XCoordinate);
Assert.Equal(50, geometry.YCoordinate);
Assert.Equal(
"Microsoft.SqlServer.Types.SqlGeometry, Microsoft.SqlServer.Types, Version=11.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91",
geometry.ProviderValue.GetType().AssemblyQualifiedName);
}
}
}
}