mirror of
https://codeberg.org/readeck/readeck.git
synced 2026-06-18 11:04:36 +00:00
This reverts commit 7314000591 that tried
to circumvent a warning with printf analysis by making every call to
strftime untranslated.
This wraps an interface implementing pgettext with extra args (any
translator) while providing the interface needed by strftime.
174 lines
4.8 KiB
Go
174 lines
4.8 KiB
Go
// SPDX-FileCopyrightText: © 2024 Olivier Meunier <olivier@neokraft.net>
|
|
//
|
|
// SPDX-License-Identifier: AGPL-3.0-only
|
|
|
|
package strftime_test
|
|
|
|
import (
|
|
"strconv"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
|
|
"codeberg.org/readeck/readeck/pkg/strftime"
|
|
)
|
|
|
|
func TestStrftime(t *testing.T) {
|
|
t.Setenv("TZ", "Europe/Amsterdam")
|
|
|
|
tests := []struct {
|
|
date string
|
|
format string
|
|
expected string
|
|
}{
|
|
{"2006-01-02T15:04:05Z", "%A - %a", "Monday - Mon"},
|
|
{"2006-01-02T15:04:05Z", "%B - %b", "January - Jan"},
|
|
{"2006-01-02T15:04:05Z", "%C", "20"},
|
|
{"2006-01-02T15:04:05Z", "%D", "01/02/2006"},
|
|
{"2006-01-02T15:04:05Z", "%e", "2"},
|
|
{"2006-01-02T15:04:05Z", "%F", "2006-01-02"},
|
|
{"2006-01-02T15:04:05Z", "%h", "Jan"},
|
|
{"2024-02-29T15:04:05Z", "%j", "060"},
|
|
{"2024-12-31T15:04:05Z", "%j", "366"},
|
|
{"2006-01-02T15:04:05Z", "%c", "Mon Jan 2 15:04:05 06"},
|
|
{"2006-01-02T15:04:05Z", "%I", "03"},
|
|
{"2006-01-02T05:04:05Z", "%k", "5"},
|
|
{"2006-01-02T15:04:05Z", "%l", "3"},
|
|
{"2006-01-02T15:04:05Z", "%Y%n", "2006\n"},
|
|
{"2006-01-02T15:04:05Z", "%p", "p.m."},
|
|
{"2006-01-02T00:00:00Z", "%l %p", "12 a.m."},
|
|
{"2006-01-02T12:00:00Z", "%l %p", "12 p.m."},
|
|
{"2006-01-02T15:04:05Z", "%R", "15:04"},
|
|
{"2006-01-02T15:04:05Z", "%r", "03:04:05 p.m."},
|
|
{"2006-01-02T15:04:05Z", "%T", "15:04:05"},
|
|
{"2006-01-02T15:04:05Z", "%t %%", "\t %"},
|
|
{"2006-01-02T15:04:05Z", "%U", "01"},
|
|
{"2024-03-03T15:04:05Z", "%u", "7"},
|
|
{"2006-01-02T15:04:05Z", "%V", "01"},
|
|
{"2024-03-04T15:04:05Z", "%V", "09"},
|
|
{"2006-01-02T15:04:05Z", "%W", "00"},
|
|
{"2024-03-04T15:04:05Z", "%W", "08"},
|
|
{"2024-03-03T15:04:05Z", "%w", "0"},
|
|
{"2006-01-02T15:04:05Z", "%v", "2-Jan-2006"},
|
|
{"2006-01-02T15:04:05Z", "%X", "15:04:05"},
|
|
{"2006-01-02T15:04:05Z", "%x", "01/02/2006"},
|
|
{"2006-01-02T15:04:05Z", "%Z", "UTC"},
|
|
{"2006-01-02T15:04:05+01:00", "%Z", "CET"},
|
|
{"2006-01-02T15:04:05Z", "%z", "+0000"},
|
|
{"2006-01-02T15:04:05+01:00", "%z", "+0100"},
|
|
{"2006-01-02T15:04:05+01:00", "%-", "%-"},
|
|
|
|
{"2006-01-02T05:04:05Z", "%A, %e %B %Y at %H:%M:%S %% test%", "Monday, 2 January 2006 at 05:04:05 % test"},
|
|
}
|
|
|
|
for i, test := range tests {
|
|
t.Run(strconv.Itoa(i), func(t *testing.T) {
|
|
date, err := time.Parse(time.RFC3339, test.date)
|
|
require.NoError(t, err)
|
|
t.Log(date, test.format, strftime.Strftime(test.format, date))
|
|
|
|
require.Equal(t, test.expected, strftime.Strftime(test.format, date))
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestTranslator(t *testing.T) {
|
|
t.Setenv("TZ", "Europe/Amsterdam")
|
|
|
|
tests := []struct {
|
|
date string
|
|
format string
|
|
expected string
|
|
}{
|
|
{"2006-01-02T15:04:05Z", "%A - %a", "lundi - lun"},
|
|
{"2006-01-02T15:04:05Z", "%B - %b", "janvier - jan"},
|
|
{"2006-01-02T15:04:05Z", "%h", "jan"},
|
|
{"2006-01-02T15:04:05Z", "%c", "lun 2 jan 2006 15:04:05"},
|
|
{"2006-01-02T15:04:05Z", "%p", "PM"},
|
|
{"2006-01-02T00:00:00Z", "%l %p", "12 AM"},
|
|
{"2006-01-02T12:00:00Z", "%l %p", "12 PM"},
|
|
{"2006-01-02T15:04:05Z", "%r", "03:04:05 PM"},
|
|
{"2006-01-02T15:04:05Z", "%v", "2-jan-2006"},
|
|
{"2006-01-02T15:04:05Z", "%x", "02/01/2006"},
|
|
|
|
{"2006-01-02T05:04:05Z", "%A, %e %B %Y at %H:%M:%S %% test%", "lundi, 2 janvier 2006 at 05:04:05 % test"},
|
|
}
|
|
|
|
f := strftime.New(translation)
|
|
for i, test := range tests {
|
|
t.Run(strconv.Itoa(i), func(t *testing.T) {
|
|
date, err := time.Parse(time.RFC3339, test.date)
|
|
require.NoError(t, err)
|
|
t.Log(date, test.format, f.Strftime(test.format, date))
|
|
|
|
require.Equal(t, test.expected, f.Strftime(test.format, date))
|
|
})
|
|
}
|
|
}
|
|
|
|
type translator map[string]map[string]string
|
|
|
|
func (t translator) Pgettext(ctx string, s string, _ ...any) string {
|
|
if r, ok := t[ctx][s]; ok && r != "" {
|
|
return r
|
|
}
|
|
return s
|
|
}
|
|
|
|
var translation = translator{
|
|
"datetime_dl": map[string]string{
|
|
"Sunday": "dimanche",
|
|
"Monday": "lundi",
|
|
"Tuesday": "mardi",
|
|
"Wednesday": "mercredi",
|
|
"Thursday": "jeudi",
|
|
"Friday": "vendredi",
|
|
"Saturday": "samedi",
|
|
},
|
|
"datetime_ds": map[string]string{
|
|
"Sun": "dim",
|
|
"Mon": "lun",
|
|
"Tue": "mar",
|
|
"Wed": "mer",
|
|
"Thu": "jeu",
|
|
"Fri": "ven",
|
|
"Sat": "sam",
|
|
},
|
|
"datetime_ml": map[string]string{
|
|
"January": "janvier",
|
|
"February": "février",
|
|
"March": "mars",
|
|
"April": "avril",
|
|
"May": "mai",
|
|
"June": "juin",
|
|
"July": "juillet",
|
|
"August": "août",
|
|
"September": "septembre",
|
|
"October": "octobre",
|
|
"November": "novembre",
|
|
"December": "décembre",
|
|
},
|
|
"datetime_ms": map[string]string{
|
|
"Jan": "jan",
|
|
"Feb": "fév",
|
|
"Mar": "mar",
|
|
"Apr": "avr",
|
|
"May": "mai",
|
|
"Jun": "jui",
|
|
"Jul": "jui",
|
|
"Aug": "aoû",
|
|
"Sep": "sep",
|
|
"Oct": "oct",
|
|
"Nov": "nov",
|
|
"Dec": "déc",
|
|
},
|
|
"datetime": map[string]string{
|
|
"a.m.": "AM",
|
|
"p.m.": "PM",
|
|
"%a %b %e %H:%M:%S %y": "%a %e %b %Y %H:%M:%S",
|
|
"%m/%d/%Y": "%d/%m/%Y",
|
|
"%H:%M:%S": "",
|
|
},
|
|
}
|