using System.Collections.Generic;
namespace Dearman_Technical_test
public Guid id { get; set; }
public ORDER_STATUS status { get; set; }
public DateTime? dispatchedTime { get; set; }
public DateTime? confirmedTime { get; set; }
public DateTime? rejectedTime { get; set; }
public DateTime? arrivalTime { get; set; }
public DateTime? deliveryTime { get; set; }
public DateTime targetArrivalStart { get; set; }
public DateTime targetArrivalEnd { get; set; }
public DateTime targetDeliveryStart { get; set; }
public DateTime targetDeliveryEnd { get; set; }
public decimal baseRate { get; set; }
public DateTime? createdWhen { get; set; }
public string createdBy { get; set; }
public static void Main(string[] args)
public static void Test1()
string input = "Ellen*Ripley*1234 N. Weaver St*Los Angeles~Dwayne*Hicks*123 Biehn St.*Oakland~William*Hudson*17 Parade St.*Tucson";
string expectedOutput = "<1>" +
"<1-3>1234 N. Weaver St</1-3>" +
"<1-4>Los Angeles</1-4>" +
"<2-3>123 Biehn St.</2-3>" +
"<3-3>17 Parade St.</3-3>" +
string output = StringParser(input);
Assert.AreEqual(expectedOutput, output);
private static string StringParser(string input)
public static void Test2()
Assert.AreEqual(20, Divisor(20, 3, 33));
Assert.AreEqual(111, Divisor(333, 3, 111));
Assert.AreEqual(42.645454545454548d, Divisor(234.55, 5.5, 171));
Assert.AreEqual(77, Divisor(1232, 4, 200));
private static double Divisor(double input, double denominator, double limit)
input = input / denominator;
public static void Test3()
Assert.AreEqual(20, DivisorRecursive(20, 3, 33));
Assert.AreEqual(111, DivisorRecursive(333, 3, 111));
Assert.AreEqual(42.645454545454548d, DivisorRecursive(234.55, 5.5, 171));
Assert.AreEqual(77, DivisorRecursive(1232, 4, 200));
private static double DivisorRecursive(double input, double denominator, double limit)
throw new NotImplementedException();
public static void Test4()
Dictionary<int, string> dict_vals = new Dictionary<int, string>();
dict_vals.Add(520, "Tucson");
dict_vals.Add(480, "Tempe");
dict_vals.Add(602, "Phoenix");
Assert.AreEqual("Tucson", GetDictionaryValue(dict_vals, 520));
Assert.AreEqual("Tempe", GetDictionaryValue(dict_vals, 480));
Assert.AreEqual("Phoenix", GetDictionaryValue(dict_vals, 602));
Assert.AreEqual(null, GetDictionaryValue(dict_vals, 1));
public static string GetDictionaryValue(Dictionary<int, string> dict, int key){
dict.TryGetValue(key, out value);
public static void Test5()
var created = new DateTime(now.Year, now.Month, 1);
List<Order> order_list = new List<Order>()
new Order { status = ORDER_STATUS.DISPATCHED, createdWhen = created.AddDays(-2)},
new Order { status = ORDER_STATUS.CONFIRMED, createdWhen = created.AddDays(-15)},
new Order { status = ORDER_STATUS.DROPPED_OFF, createdWhen=created, deliveryTime = created.AddDays(17), },
new Order { status = ORDER_STATUS.DROPPED_OFF, createdWhen=created.AddDays(1), deliveryTime = created.AddDays(30) },
new Order { status = ORDER_STATUS.DROPPED_OFF, createdWhen=created.AddDays(2), deliveryTime = created.AddDays(7) },
new Order { status = ORDER_STATUS.DROPPED_OFF, createdWhen=created.AddDays(3), deliveryTime = created.AddDays(11) },
new Order { status = ORDER_STATUS.PICKED_UP , createdWhen = created.AddMonths(-1)}
static Order GetLastDeliveredOrder(List<Order> orders){
var lastDeliveredOrder = orders.Where(x => x.status == ORDER_STATUS.DROPPED_OFF).OrderByDescending(x => x.deliveryTime).FirstOrDefault();
return lastDeliveredOrder;
public static void Test6()
var created = new DateTime(now.Year, now.Month, 1);
List<Order> order_list = new List<Order>()
new Order { status = ORDER_STATUS.DISPATCHED, createdWhen = created.AddDays(-2)},
new Order { status = ORDER_STATUS.CONFIRMED, createdWhen = created.AddDays(-15)},
new Order { status = ORDER_STATUS.DROPPED_OFF, createdWhen=created, deliveryTime = created.AddDays(17), },
new Order { status = ORDER_STATUS.DROPPED_OFF, createdWhen=created.AddDays(1), deliveryTime = created.AddDays(30) },
new Order { status = ORDER_STATUS.DROPPED_OFF, createdWhen=created.AddDays(2), deliveryTime = created.AddDays(7) },
new Order { status = ORDER_STATUS.DROPPED_OFF, createdWhen=created.AddDays(3), deliveryTime = created.AddDays(11) },
new Order { status = ORDER_STATUS.PICKED_UP , createdWhen = created.AddMonths(-1)}
static Order GetLastDeliveredOrderLooping(List<Order> orders){
var lastDeliveredOrder = new Order();
foreach(var order in orders){
if(order.status == ORDER_STATUS.DROPPED_OFF && order.deliveryTime > lastDeliveredOrder.deliveryTime){
lastDeliveredOrder = order;
return lastDeliveredOrder;
static decimal GetDriverPay(Order order){
decimal driverPayTotal = 0;
if(order.status == ORDER_STATUS.REJECTED){
if(order.status == ORDER_STATUS.CONFIRMED){
return driverPayTotal + 1;
if(order.status == ORDER_STATUS.DROPPED_OFF){
driverPayTotal = driverPayTotal + order.baseRate + 1;
if(order.arrivalTime <= order.targetArrivalEnd){
driverPayTotal += driverPayTotal * (decimal)0.03;
}if(order.deliveryTime <= order.targetDeliveryEnd){
driverPayTotal += driverPayTotal * (decimal)0.05;
public static void Test7()
var rejectedOrder = new Order { status = ORDER_STATUS.REJECTED , createdWhen = DateTime.Now};
var confirmedOrder = new Order { status = ORDER_STATUS.CONFIRMED , createdWhen = DateTime.Now};
Assert.AreEqual(0, GetDriverPay(rejectedOrder));
Assert.AreEqual(1, GetDriverPay(confirmedOrder));