private static (bool isValid, string validationError) MeterReadingValid(GasLog log, AutomobileInfo auto) { if (log == null) { throw new ArgumentNullException(nameof(log)); } if (auto == null) { throw new ArgumentNullException(nameof(auto)); } if (auto.MeterReading <= 0) { return(false, "The automobile's meter reading is invalid"); } // automobile's meter reading should less then new meter reading if (auto.MeterReading > log.CurrentMeterReading.TotalKilometre) { return(false, "The automobile's meter reading is larger then gas log"); } // the difference between current automobile meter reading and new meter reading should greater then log distance if (log.CurrentMeterReading - Dimension.FromKilometer(auto.MeterReading) < log.Distance) { return(false, "The logging distance is invalid"); } return(log.CurrentMeterReading - Dimension.FromKilometer(auto.MeterReading) != log.Distance ? (true, "Current log distance plus automobile's current meter reading does not match log's current meter reading") : (true, string.Empty)); }
public void CanAddGasLogHistory() { // Arrange const string comment = "This is a test gas log"; var car = _autoManager.GetEntityById(1); var discount = _discountManager.GetEntities().FirstOrDefault(); var logDate = new DateTime(2019, 12, 25); var gasLog = new GasLog { Date = logDate, Car = car, Station = "Costco", Gas = Volume.FromLiter(40), Price = new Money(40.0), Distance = Dimension.FromKilometer(300), CurrentMeterReading = Dimension.FromKilometer(12000), Discounts = new List <GasDiscountInfo> { new() { Amount = new Money(0.8), Program = discount } },
public MappingProfile() { // Author CreateMap <ApiAuthor, Author>() .ForMember(d => d.Role, opt => opt.MapFrom(src => Enum.Parse(typeof(AuthorRoleType), src.Role, true))); CreateMap <Author, ApiAuthor>() .ForMember(d => d.Role, opt => opt.MapFrom(src => src.Role.ToString().ToLower())); CreateMap <ApiAuthorForCreate, Author>(); CreateMap <ApiAuthorForUpdate, Author>(); CreateMap <Author, ApiAuthorForUpdate>(); CreateMap <PageList <Author>, PageList <ApiAuthor> >() .ConvertUsing(new PageListConverter <Author, ApiAuthor>()); // Render CreateMap <ApiNoteRender, NoteRender>(); CreateMap <NoteRender, ApiNoteRender>(); CreateMap <ApiNoteRenderForCreate, NoteRender>(); CreateMap <ApiNoteRenderForUpdate, NoteRender>(); CreateMap <NoteRender, ApiNoteRenderForUpdate>(); CreateMap <PageList <NoteRender>, PageList <ApiNoteRender> >() .ConvertUsing(new PageListConverter <NoteRender, ApiNoteRender>()); // Catalog CreateMap <ApiNoteCatalog, NoteCatalog>(); CreateMap <NoteCatalog, ApiNoteCatalog>() .ForMember(c => c.SubsystemId, opt => opt.MapFrom(s => s.Subsystem.Id)) .ForMember(c => c.RenderId, opt => opt.MapFrom(s => s.Render.Id)); CreateMap <ApiNoteCatalogForCreate, NoteCatalog>(); CreateMap <ApiNoteCatalogForUpdate, NoteCatalog>(); CreateMap <NoteCatalog, ApiNoteCatalogForUpdate>(); CreateMap <PageList <NoteCatalog>, PageList <ApiNoteCatalog> >() .ConvertUsing(new PageListConverter <NoteCatalog, ApiNoteCatalog>()); // Subsystem CreateMap <Subsystem, ApiSubsystem>() .ForMember(t => t.DefaultAuthorId, opt => opt.MapFrom(s => s.DefaultAuthor.Id)) .ForMember(t => t.NoteCatalogIds, opt => opt.MapFrom(s => s.NoteCatalogs.Select(c => c.Id).ToList())); CreateMap <ApiSubsystem, Subsystem>(); CreateMap <ApiSubsystemForUpdate, Subsystem>(); CreateMap <Subsystem, ApiSubsystemForUpdate>(); CreateMap <PageList <Subsystem>, PageList <ApiSubsystem> >() .ConvertUsing(new PageListConverter <Subsystem, ApiSubsystem>()); // Note CreateMap <Core.DomainEntity.HmmNote, ApiNote>() .ForMember(n => n.AuthorId, opt => opt.MapFrom(s => s.Author.Id)) .ForMember(n => n.CatalogId, opt => opt.MapFrom(s => s.Catalog.Id)); CreateMap <ApiNoteForCreate, Core.DomainEntity.HmmNote>() .ForMember(n => n.Author, opt => opt.MapFrom(s => new Author { Id = s.AuthorId })) .ForMember(n => n.Catalog, opt => opt.MapFrom(s => new NoteCatalog() { Id = s.NoteCatalogId })); CreateMap <ApiNoteForUpdate, Core.DomainEntity.HmmNote>(); CreateMap <Core.DomainEntity.HmmNote, ApiNoteForUpdate>(); CreateMap <PageList <Core.DomainEntity.HmmNote>, PageList <ApiNote> >() .ConvertUsing(new PageListConverter <Core.DomainEntity.HmmNote, ApiNote>()); // Automobile CreateMap <ApiAutomobile, AutomobileInfo>(); CreateMap <AutomobileInfo, ApiAutomobile>(); CreateMap <ApiAutomobileForCreate, AutomobileInfo>(); CreateMap <ApiAutomobileForUpdate, AutomobileInfo>(); CreateMap <AutomobileInfo, ApiAutomobileForUpdate>(); CreateMap <PageList <AutomobileInfo>, PageList <ApiAutomobile> >() .ConvertUsing(new PageListConverter <AutomobileInfo, ApiAutomobile>()); // Gas Discount: setup map from domain entity to DTO CreateMap <GasDiscount, ApiDiscount>() .ForMember(d => d.Amount, opt => opt.MapFrom(s => s.Amount.Amount)); CreateMap <GasDiscountInfo, ApiDiscountInfo>() .ForMember(d => d.DiscountId, opt => opt.MapFrom(s => s.Program.Id)) .ForMember(d => d.Amount, opt => opt.MapFrom(s => s.Amount.Amount)); CreateMap <ApiDiscountForCreate, GasDiscount>() .ForMember(d => d.Amount, opt => opt.MapFrom(src => new Money(src.Amount, CurrencyCodeType.Cad))); CreateMap <ApiDiscountForUpdate, GasDiscount>() .ForMember(d => d.Amount, opt => opt.MapFrom(src => new Money(src.Amount, CurrencyCodeType.Cad))); CreateMap <GasDiscount, ApiDiscountForUpdate>() .ForMember(d => d.Amount, opt => opt.MapFrom(src => src.Amount.Amount)); CreateMap <PageList <GasDiscount>, PageList <ApiDiscount> >() .ConvertUsing(new PageListConverter <GasDiscount, ApiDiscount>()); // Gas Log CreateMap <GasLog, ApiGasLog>() .ForMember(d => d.CarId, opt => opt.MapFrom(s => s.Car.Id)) .ForMember(d => d.Distance, opt => opt.MapFrom(s => s.Distance.TotalKilometre)) .ForMember(d => d.CurrentMeterReading, opt => opt.MapFrom(s => s.CurrentMeterReading.TotalKilometre)) .ForMember(d => d.Gas, opt => opt.MapFrom(s => s.Gas.TotalLiter)) .ForMember(d => d.Price, opt => opt.MapFrom(s => s.Price.Amount)) .ForMember(d => d.DiscountInfos, opt => opt.MapFrom(s => s.Discounts)) .ForMember(d => d.GasStation, opt => opt.MapFrom(s => s.Station)); CreateMap <ApiGasLogForCreation, GasLog>() .ForMember(d => d.Distance, opt => opt.MapFrom(s => Dimension.FromKilometer(s.Distance))) .ForMember(d => d.CurrentMeterReading, opt => opt.MapFrom(s => Dimension.FromKilometer(s.CurrentMeterReading))) .ForMember(d => d.Gas, opt => opt.MapFrom(s => Volume.FromLiter(s.Gas))) .ForMember(d => d.Price, opt => opt.MapFrom(s => new Money(s.Price))) .ForMember(d => d.Discounts, opt => opt.Ignore()) .ForMember(d => d.Car, opt => opt.Ignore()) .ForMember(d => d.Station, opt => opt.MapFrom(src => src.GasStation)); CreateMap <ApiGasLog, GasLog>() .ForMember(d => d.Car, opt => opt.MapFrom(src => new AutomobileInfo { Id = src.CarId })) .ForMember(d => d.Distance, opt => opt.MapFrom(src => Dimension.FromKilometer(src.Distance))) .ForMember(d => d.CurrentMeterReading, opt => opt.MapFrom(src => Dimension.FromKilometer(src.CurrentMeterReading))) .ForMember(d => d.Gas, opt => opt.MapFrom((src => Volume.FromLiter(src.Gas)))) .ForMember(d => d.Price, opt => opt.MapFrom(src => new Money(src.Price))) .ForMember(d => d.Station, opt => opt.MapFrom(src => src.GasStation)); CreateMap <PageList <GasLog>, PageList <ApiGasLog> >() .ConvertUsing(new PageListConverter <GasLog, ApiGasLog>()); }