public void CreditcardPaymentRequest()
        {
            var obj = new CreditcardPaymentRequest
            {
                Amount   = 10,
                Capture  = true,
                Currency = "Lorum_342",
                Details  = new CreditcardDetailsRequest
                {
                    CallbackUrl  = "Lorum_3",
                    CancelledUrl = "Lorum_968",
                    ExpiredUrl   = "Lorum_735",
                    FailedUrl    = "Lorum_85",
                    Issuers      = new []
                    {
                        "Lorum_310",
                        "Lorum_586"
                    },
                    PurchaseId = "Lorum_455",
                    Recurring  = false,
                    SuccessUrl = "Lorum_728"
                },
                DueDate = DateTime.Now
            };
            var deserialized = ConversionTest(obj);

            Assert.IsNotNull(deserialized);
            Assert.AreEqual(obj.Amount, deserialized.Amount);
            Assert.AreEqual(obj.Capture, deserialized.Capture);
            Assert.AreEqual(obj.Currency, deserialized.Currency);
            Assert.AreEqual(obj.Details.CallbackUrl, deserialized.Details.CallbackUrl);
            Assert.AreEqual(obj.Details.CancelledUrl, deserialized.Details.CancelledUrl);
            Assert.AreEqual(obj.Details.ExpiredUrl, deserialized.Details.ExpiredUrl);
            Assert.AreEqual(obj.Details.FailedUrl, deserialized.Details.FailedUrl);
            Assert.AreEqual(obj.Details.Issuers.IsFixedSize, deserialized.Details.Issuers.IsFixedSize);
            Assert.AreEqual(obj.Details.Issuers.IsReadOnly, deserialized.Details.Issuers.IsReadOnly);
            Assert.AreEqual(obj.Details.Issuers.IsSynchronized, deserialized.Details.Issuers.IsSynchronized);
            Assert.AreEqual(obj.Details.Issuers.Length, deserialized.Details.Issuers.Length);
            Assert.AreEqual(obj.Details.Issuers.LongLength, deserialized.Details.Issuers.LongLength);
            Assert.AreEqual(obj.Details.Issuers.Rank, deserialized.Details.Issuers.Rank);
            Assert.AreEqual(obj.Details.PurchaseId, deserialized.Details.PurchaseId);
            Assert.AreEqual(obj.Details.Recurring, deserialized.Details.Recurring);
            Assert.AreEqual(obj.Details.SuccessUrl, deserialized.Details.SuccessUrl);
            // Check only date and time up to seconds.. Json.NET does not save milliseconds.
            Assert.AreEqual(obj.DueDate.HasValue, deserialized.DueDate.HasValue);
            if (obj.DueDate.HasValue && deserialized.DueDate.HasValue)
            {
                Assert.AreEqual(
                    new DateTime(obj.DueDate.Value.Year, obj.DueDate.Value.Month, obj.DueDate.Value.Day, obj.DueDate.Value.Hour, obj.DueDate.Value.Minute, obj.DueDate.Value.Second),
                    new DateTime(deserialized.DueDate.Value.Year, deserialized.DueDate.Value.Month, deserialized.DueDate.Value.Day, deserialized.DueDate.Value.Hour, deserialized.DueDate.Value.Minute, deserialized.DueDate.Value.Second));
            }
        }
        /// <inheritdoc />
        /// <summary>
        /// Reads the json.
        /// </summary>
        /// <param name="reader">The reader.</param>
        /// <param name="objectType">Type of the object.</param>
        /// <param name="existingValue">The existing value.</param>
        /// <param name="serializer">The serializer.</param>
        /// <returns></returns>
        /// <exception cref="T:System.ArgumentException"></exception>
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            PaymentRequest target;
            var            token = JToken.Load(reader);

            switch (Enum.Parse(typeof(PaymentMethod), token["payment_method"].Value <string>()))
            {
            case PaymentMethod.iDEAL:
                target = new IdealPaymentRequest();
                break;

            case PaymentMethod.PayPal:
                target = new PayPalPaymentRequest();
                break;

            case PaymentMethod.AfterPay:
                target = new AfterPayPaymentRequest();
                break;

            case PaymentMethod.Creditcard:
                target = new CreditcardPaymentRequest();
                break;

            case PaymentMethod.Bancontact:
                target = new BancontactPaymentRequest();
                break;

            case PaymentMethod.WireTransfer:
                target = new WireTransferPaymentRequest();
                break;

            case PaymentMethod.SOFORT:
                target = new SofortPaymentRequest();
                break;

            case PaymentMethod.DirectDebit:
                target = new DirectDebitPaymentRequest();
                break;

            default:
                throw new ArgumentException();
            }

            serializer.Populate(token.CreateReader(), target);
            return(target);
        }