Skip to content

Commit

Permalink
Bugfix/90 (#91)
Browse files Browse the repository at this point in the history
* Fix: bad formatting date for en-US

* Add more test scenarios for en-US formatting date

* Fix: move date formatting to the return format date methods

* Fix: correct codacy recomendations

* Fix: add forgotten semicolons

* Rename variable to make sense the meaning

* Add test for each locale

* Create an auxiliar function to avoid Codacy issues

* Update patch version

* Remove not used parameters

Co-authored-by: Francisco Javier Aguado <fjaguado@werfen.com>
  • Loading branch information
fjaguado and Francisco Javier Aguado committed Sep 21, 2022
1 parent 69bc1ef commit bf52190
Show file tree
Hide file tree
Showing 4 changed files with 147 additions and 119 deletions.
2 changes: 1 addition & 1 deletion projects/systelab-translate/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
"Translate",
"i18n"
],
"version": "11.1.1",
"version": "11.1.2",
"license": "MIT",
"homepage": "https://github.com/systelab/systelab-translate.git",
"repository": {
Expand Down
164 changes: 68 additions & 96 deletions projects/systelab-translate/src/lib/date-util/date-util.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,9 +35,9 @@ export class DateUtil {
if (!date) {
return undefined;
}
const formatedDate = (fullYear) ? this.formatDateFullYear(date) : this.formatDate(date);
const formatedHour = this.formatTime(date, withSeconds);
return formatedDate + ' ' + formatedHour;
const formattedDate = (fullYear) ? this.formatDateFullYear(date) : this.formatDate(date);
const formattedHour = this.formatTime(date, withSeconds);
return formattedDate + ' ' + formattedHour;
}

public formatMonthAndYear(date: Date): string {
Expand Down Expand Up @@ -86,100 +86,12 @@ export class DateUtil {
}
}

public getDateFormat(isFullYear = false): string {
let stringDateFormat = '';
switch (this.locale) {
case 'en-US':
stringDateFormat = 'M/d/yy';
break;
case 'ko-KO':
stringDateFormat = 'yy. M. d';
break;
case 'pl-PL':
case 'lt-LT':
stringDateFormat = 'yy-MM-dd';
break;
case 'pt-PT':
case 'pt-BR':
case 'nl-NL':
stringDateFormat = 'dd-MM-yy';
break;
case 'sk-SK':
case 'ru-RU':
stringDateFormat = 'd.M.yy';
break;
case 'zh-ZH':
stringDateFormat = 'yy-M-d';
break;
case 'de-DE':
stringDateFormat = 'dd.MM.yy';
break;
case 'th-TH':
stringDateFormat = 'd/M/yy';
break;
case 'ja-JA':
stringDateFormat = 'yy/MM/dd';
break;
default:
stringDateFormat = 'dd/MM/yy';
break;
}
if (isFullYear) {
stringDateFormat = stringDateFormat.replace('yy', 'yyyy');
if (this.locale === 'en-US') {
stringDateFormat = stringDateFormat.replace('M', 'MM');
stringDateFormat = stringDateFormat.replace('D', 'dd');
}
}
return stringDateFormat;
public getDateFormat(fullDateFormat = false): string {
return this.getLocalizedStringDateFormat(this.locale, fullDateFormat);
}

public getDateFormatForDatePicker(isFullYear = false): string {
let stringDateFormat = '';
switch (this.locale) {
case 'en-US':
stringDateFormat = 'm/d/y';
break;
case 'ko-KO':
stringDateFormat = 'y. m. d';
break;
case 'pl-PL':
case 'lt-LT':
stringDateFormat = 'y-mm-dd';
break;
case 'pt-PT':
case 'pt-BR':
case 'nl-NL':
stringDateFormat = 'dd-mm-y';
break;
case 'sk-SK':
case 'ru-RU':
stringDateFormat = 'd.m.y';
break;
case 'zh-CN':
stringDateFormat = 'y-m-d';
break;
case 'de-DE':
stringDateFormat = 'dd.mm.y';
break;
case 'th-TH':
stringDateFormat = 'd/m/y';
break;
case 'ja-JA':
stringDateFormat = 'y/mm/dd';
break;
default:
stringDateFormat = 'dd/mm/y';
break;
}
if (isFullYear) {
stringDateFormat = stringDateFormat.replace('y', 'yy');
if (this.locale === 'en-US') {
stringDateFormat = stringDateFormat.replace('m', 'mm');
stringDateFormat = stringDateFormat.replace('d', 'dd');
}
}
return stringDateFormat;
public getDateFormatForDatePicker(fullDateFormat = false): string {
return this.getLocalizedDateFormatForDatePicker(this.locale, fullDateFormat);
}

public getFirstDayOfWeek(): number {
Expand Down Expand Up @@ -248,7 +160,67 @@ export class DateUtil {
['sk-SK', sk], ['ru', ru], ['ru-RU', ru], ['zh', zhCN], ['zh-CN', zhCN], ['de', de], ['de-DE', de],
['th', th], ['th-TH', th], ['ja', ja], ['ja-JA', ja], ['ko', ko], ['ko-KR', ko], ['nl', nl], ['nl-NL', nl],
]);
const locale: Locale = localeForSystelabLocale.get(localeString)
const locale: Locale = localeForSystelabLocale.get(localeString);
return locale ? locale : enUS;
}

private getLocalizedStringDateFormat(locale: string, fullDateFormat = false): string {
const year = fullDateFormat ? 'yyyy' : 'yy';
switch (locale) {
case 'en-US':
return fullDateFormat ? `MM/dd/${year}` : `M/d/${year}`;
case 'ko-KO':
return `${year}. M. d`;
case 'pl-PL':
case 'lt-LT':
return `${year}-MM-dd`;
case 'pt-PT':
case 'pt-BR':
case 'nl-NL':
return `dd-MM-${year}`;
case 'sk-SK':
case 'ru-RU':
return `d.M.${year}`;
case 'zh-ZH':
return `${year}-M-d`;
case 'de-DE':
return `dd.MM.${year}`;
case 'th-TH':
return `d/M/${year}`;
case 'ja-JA':
return `${year}/MM/dd`;
default:
return `dd/MM/${year}`;
}
}

private getLocalizedDateFormatForDatePicker(locale: string, fullDateFormat = false): string {
const year = fullDateFormat ? 'yy' : 'y';
switch (locale) {
case 'en-US':
return fullDateFormat ? `mm/dd/${year}` : `m/d/${year}`;
case 'ko-KO':
return `${year}. m. d`;
case 'pl-PL':
case 'lt-LT':
return `${year}-mm-dd`;
case 'pt-PT':
case 'pt-BR':
case 'nl-NL':
return `dd-mm-${year}`;
case 'sk-SK':
case 'ru-RU':
return `d.m.${year}`;
case 'zh-CN':
return `${year}-m-d`;
case 'de-DE':
return `dd.mm.${year}`;
case 'th-TH':
return `d/m/${year}`;
case 'ja-JA':
return `${year}/mm/dd`;
default:
return `dd/mm/${year}`;
}
}
}
96 changes: 76 additions & 20 deletions projects/systelab-translate/src/test/date.service.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,32 @@ import { httpLoaderFactory, I18nService } from '../public-api';
import { TestBed } from '@angular/core/testing';
import { TranslateLoader, TranslateModule } from '@ngx-translate/core';
import { HttpClient, HttpClientModule } from '@angular/common/http';
import {DateUtil} from '../lib/date-util/date-util';

const getExampleDate = (oneDigitDay = false): Date => {
const date = new Date();
const day = oneDigitDay ? 1 : 28;
const month = oneDigitDay ? 4 : 0;
date.setFullYear(2016, month, day);
return date;
};

const getExampleDateTime = (oneDigitDay = false): Date => {
const date = getExampleDate(oneDigitDay);
date.setHours(21);
date.setMinutes(0, 0, 0);
return date;
};

const expectGetDateFormatForDatePicker = (locale: string, expectedDateFormat: string): void => {
const dateUtil = new DateUtil(locale);
expect(dateUtil.getDateFormatForDatePicker()).toBe(expectedDateFormat);
};

const expectGetDateFormat = (locale: string, expectedDateFormat: string): void => {
const dateUtil = new DateUtil(locale);
expect(dateUtil.getDateFormat()).toBe(expectedDateFormat);
};

describe('Date Service', () => {
let service: I18nService;
Expand Down Expand Up @@ -42,15 +68,55 @@ describe('Date Service', () => {
});
});

it('Format a date for Datepicker', done => {
expectGetDateFormatForDatePicker('en-US', 'm/d/y');
expectGetDateFormatForDatePicker('ko-KO', 'y. m. d');
expectGetDateFormatForDatePicker('pl-PL', 'y-mm-dd');
expectGetDateFormatForDatePicker('lt-LT', 'y-mm-dd');
expectGetDateFormatForDatePicker('pt-PT', 'dd-mm-y');
expectGetDateFormatForDatePicker('pt-BR', 'dd-mm-y');
expectGetDateFormatForDatePicker('nl-NL', 'dd-mm-y');
expectGetDateFormatForDatePicker('sk-SK', 'd.m.y');
expectGetDateFormatForDatePicker('ru-RU', 'd.m.y');
expectGetDateFormatForDatePicker('zh-CN', 'y-m-d');
expectGetDateFormatForDatePicker('de-DE', 'dd.mm.y');
expectGetDateFormatForDatePicker('th-TH', 'd/m/y');
expectGetDateFormatForDatePicker('ja-JA', 'y/mm/dd');
expectGetDateFormatForDatePicker('es-ES', 'dd/mm/y');
expectGetDateFormatForDatePicker('ca-ES', 'dd/mm/y');
done();
});

it('Localized String Date Format', done => {
expectGetDateFormat('en-US', 'M/d/yy');
expectGetDateFormat('ko-KO', 'yy. M. d');
expectGetDateFormat('pl-PL', 'yy-MM-dd');
expectGetDateFormat('lt-LT', 'yy-MM-dd');
expectGetDateFormat('pt-PT', 'dd-MM-yy');
expectGetDateFormat('pt-BR', 'dd-MM-yy');
expectGetDateFormat('nl-NL', 'dd-MM-yy');
expectGetDateFormat('sk-SK', 'd.M.yy');
expectGetDateFormat('ru-RU', 'd.M.yy');
expectGetDateFormat('zh-ZH', 'yy-M-d');
expectGetDateFormat('de-DE', 'dd.MM.yy');
expectGetDateFormat('th-TH', 'd/M/yy');
expectGetDateFormat('ja-JA', 'yy/MM/dd');
expectGetDateFormat('es-ES', 'dd/MM/yy');
expectGetDateFormat('ca-ES', 'dd/MM/yy');
done();
});

it('Format a date in USA', (done) => {
service.use('en-US')
.subscribe(() => {
const date = new Date();
date.setFullYear(2016, 0, 28);
const date = getExampleDate();
const dateWith1DigitDay = getExampleDate(true);
expect(service.formatDate(date))
.toBe('1/28/16');
expect(service.formatDateFullYear(date))
.toBe('01/28/2016');
expect(service.formatDateFullYear(dateWith1DigitDay))
.toBe('05/01/2016');
done();
});
});
Expand Down Expand Up @@ -80,10 +146,7 @@ describe('Date Service', () => {
it('Format a time and a date and time', (done) => {
service.use('es-ES')
.subscribe(() => {
const date = new Date();
date.setFullYear(2016, 0, 28);
date.setHours(21);
date.setMinutes(0, 0, 0);
const date = getExampleDateTime();
expect(service.formatTime(date))
.toBe('21:00');
expect(service.formatDateTime(date))
Expand All @@ -95,10 +158,7 @@ describe('Date Service', () => {
it('Format a time and a date and time in USA', (done) => {
service.use('en-US')
.subscribe(() => {
const date = new Date();
date.setFullYear(2016, 0, 28);
date.setHours(21);
date.setMinutes(0, 0, 0);
const date = getExampleDateTime();
expect(service.formatTime(date))
.toBe('09:00 PM');
expect(service.formatDateTime(date))
Expand All @@ -110,8 +170,7 @@ describe('Date Service', () => {
it('Get dates at the begging of the day, at the end and at noon', (done) => {
service.use('es-ES')
.subscribe(() => {
const date = new Date();
date.setFullYear(2016, 0, 28);
const date = getExampleDate();
date.setHours(21);
expect(service.formatDateTime(service.getDateFrom(date)))
.toBe('28/01/16 00:00');
Expand All @@ -126,10 +185,7 @@ describe('Date Service', () => {
it('Format a date and time with AM/PM', (done) => {
service.use('es-ES')
.subscribe(() => {
const date = new Date();
date.setFullYear(2016, 0, 28);
date.setHours(21);
date.setMinutes(0, 0, 0);
const date = getExampleDateTime();
expect(service.formatTime(date))
.toBe('21:00');
expect(service.formatDateTime(date))
Expand All @@ -143,16 +199,16 @@ describe('Date Service', () => {
it('Format a date and time in USA with AM/PM', (done) => {
service.use('en-US')
.subscribe(() => {
const date = new Date();
date.setFullYear(2016, 0, 28);
date.setHours(21);
date.setMinutes(0, 0, 0);
const date = getExampleDateTime();
const dateWithOneDigitDay = getExampleDateTime(true);
expect(service.formatTime(date))
.toBe('09:00 PM');
expect(service.formatDateTime(date))
.toBe('1/28/16 09:00 PM');
expect(service.formatDateTime(date, false, true))
.toBe('1/28/16 09:00:00 PM');
expect(service.formatDateTime(dateWithOneDigitDay, false, true))
.toBe('5/1/16 09:00:00 PM');
done();
});
});
Expand Down
4 changes: 2 additions & 2 deletions projects/systelab-translate/src/test/i18n.service.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ describe('Translate Service', () => {
.toBe('Day');
done();
},
(error) => {
() => {
});
});

Expand Down Expand Up @@ -329,7 +329,7 @@ describe('Translate Service', () => {
.toBe('Day');
done();
},
(error) => {
() => {
});
});

Expand Down

0 comments on commit bf52190

Please sign in to comment.