/// <summary>
        /// プロパティのset/getを範囲外の値で設定して、エラーとなることを確認する
        /// </summary>
        /// <param name="obj">チェック対象のオブジェクト</param>
        /// <param name="propertyName">プロパティ名</param>
        /// <param name="start">初期値</param>
        /// <param name="min">最小値</param>
        /// <param name="max">最大値</param>
        public static void CheckInvalid <T1>(T1 obj, string propertyName, int start, int min, int max) where T1 : INotifyDataErrorInfo, INotifyPropertyChanged
        {
            PropertyInfo property = obj.GetType().GetProperty(propertyName);

            if (property == null || (!property.CanRead && !property.CanWrite))
            {
                Assert.Fail();
            }
            var original = Thread.CurrentThread.CurrentUICulture;

            try {
                string[] lang = { "en", "ja-JP" };
                for (int i = 0; i < 2; i++)
                {
                    Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(lang[i]);
                    var target = (int)(property.GetValue(obj));
                    property.SetValue(obj, start);
                    var prop = new Microsoft.Practices.Prism.TestSupport.PropertyChangeTracker(obj);
                    property.SetValue(obj, min - 1);
                    Assert.AreEqual((int)(property.GetValue(obj)), min - 1);
                    errorcheck(obj, propertyName, min, max, true);
                    Assert.AreEqual(prop.ChangedProperties.Length, 2);
                    Assert.AreEqual(prop.ChangedProperties[0], propertyName);
                    Assert.AreEqual(prop.ChangedProperties[1], propertyName);
                    property.SetValue(obj, max + 1);
                    Assert.AreEqual((int)(property.GetValue(obj)), max + 1);
                    errorcheck(obj, propertyName, min, max, true);
                }
            }
            finally {
                Thread.CurrentThread.CurrentUICulture = original;
            }
        }
        /// <summary>
        /// プロパティのset/getを範囲内の値で設定して、エラーとならないことを確認する
        /// </summary>
        /// <param name="obj">チェック対象のオブジェクト</param>
        /// <param name="propertyName">プロパティ名</param>
        /// <param name="start">初期値</param>
        /// <param name="min">最小値</param>
        /// <param name="max">最大値</param>
        public static void CheckValid <T1, T2>(T1 obj, string propertyName, T2 start, T2 min, T2 max) where T1 : INotifyDataErrorInfo, INotifyPropertyChanged
        {
            PropertyInfo property = obj.GetType().GetProperty(propertyName);

            if (property == null || (!property.CanRead && !property.CanWrite))
            {
                Assert.Fail();
            }
            var target = (T2)(property.GetValue(obj));

            property.SetValue(obj, start);
            var prop = new Microsoft.Practices.Prism.TestSupport.PropertyChangeTracker(obj);

            property.SetValue(obj, min);
            Assert.AreEqual((T2)(property.GetValue(obj)), min);
            Assert.AreEqual(obj.HasErrors, false);
            Assert.AreEqual(prop.ChangedProperties.Length, 1);
            Assert.AreEqual(prop.ChangedProperties[0], propertyName);
            property.SetValue(obj, max);
            Assert.AreEqual((T2)(property.GetValue(obj)), max);
            Assert.AreEqual(obj.HasErrors, false);
        }