419 lines
12 KiB
Go
419 lines
12 KiB
Go
|
|
package parser_test
|
||
|
|
|
||
|
|
import (
|
||
|
|
"backend/parser"
|
||
|
|
"backend/utils"
|
||
|
|
"fmt"
|
||
|
|
"testing"
|
||
|
|
"time"
|
||
|
|
)
|
||
|
|
|
||
|
|
func TestParseDettaglio(t *testing.T) {
|
||
|
|
tests := []struct {
|
||
|
|
input string
|
||
|
|
wantDisp *string
|
||
|
|
wantPerm *[]int
|
||
|
|
wantPers *[]string
|
||
|
|
}{
|
||
|
|
{
|
||
|
|
input: "disp:01/10 perm:3-6 persone:single",
|
||
|
|
wantDisp: utils.Ptr(fmt.Sprintf("01/10/%d", time.Now().Year())),
|
||
|
|
wantPerm: utils.Ptr([]int{3, 6}),
|
||
|
|
wantPers: utils.Ptr([]string{"single"}),
|
||
|
|
},
|
||
|
|
{
|
||
|
|
input: "disp: perm: persone:",
|
||
|
|
wantDisp: nil,
|
||
|
|
wantPerm: nil,
|
||
|
|
wantPers: nil,
|
||
|
|
},
|
||
|
|
{
|
||
|
|
input: "disp: perm:3-6 persone:single", // disp missing
|
||
|
|
wantDisp: nil,
|
||
|
|
wantPerm: utils.Ptr([]int{3, 6}),
|
||
|
|
wantPers: utils.Ptr([]string{"single"}),
|
||
|
|
},
|
||
|
|
{
|
||
|
|
input: "disp:01/10 perm: persone:single", // perm missing
|
||
|
|
wantDisp: utils.Ptr(fmt.Sprintf("01/10/%d", time.Now().Year())),
|
||
|
|
wantPerm: nil,
|
||
|
|
wantPers: utils.Ptr([]string{"single"}),
|
||
|
|
},
|
||
|
|
{
|
||
|
|
input: "disp:01/10 perm:3-6 persone:", // persone missing
|
||
|
|
wantDisp: utils.Ptr(fmt.Sprintf("01/10/%d", time.Now().Year())),
|
||
|
|
wantPerm: utils.Ptr([]int{3, 6}),
|
||
|
|
wantPers: nil,
|
||
|
|
},
|
||
|
|
{
|
||
|
|
input: "disp: perm: persone:", // all fields missing
|
||
|
|
wantDisp: nil,
|
||
|
|
wantPerm: nil,
|
||
|
|
wantPers: nil,
|
||
|
|
},
|
||
|
|
{
|
||
|
|
input: "disp:bad_date perm:3-6 persone:single", // invalid date
|
||
|
|
wantDisp: nil,
|
||
|
|
wantPerm: utils.Ptr([]int{3, 6}),
|
||
|
|
wantPers: utils.Ptr([]string{"single"}),
|
||
|
|
},
|
||
|
|
{
|
||
|
|
input: "disp:01/10 perm:abc-6 persone:single", // non-numeric perm
|
||
|
|
wantDisp: utils.Ptr(fmt.Sprintf("01/10/%d", time.Now().Year())),
|
||
|
|
wantPerm: utils.Ptr([]int{6}),
|
||
|
|
wantPers: utils.Ptr([]string{"single"}),
|
||
|
|
},
|
||
|
|
{
|
||
|
|
input: "disp:01/10 perm:3- persone:single", // trailing delimiter in perm
|
||
|
|
wantDisp: utils.Ptr(fmt.Sprintf("01/10/%d", time.Now().Year())),
|
||
|
|
wantPerm: utils.Ptr([]int{3}),
|
||
|
|
wantPers: utils.Ptr([]string{"single"}),
|
||
|
|
},
|
||
|
|
{
|
||
|
|
input: "disp:01/10 perm:-6 persone:single", // leading delimiter in perm
|
||
|
|
wantDisp: utils.Ptr(fmt.Sprintf("01/10/%d", time.Now().Year())),
|
||
|
|
wantPerm: utils.Ptr([]int{6}),
|
||
|
|
wantPers: utils.Ptr([]string{"single"}),
|
||
|
|
},
|
||
|
|
{
|
||
|
|
input: "disp:01/10 perm:3-6 persone:single/", // trailing delimiter in persone
|
||
|
|
wantDisp: utils.Ptr(fmt.Sprintf("01/10/%d", time.Now().Year())),
|
||
|
|
wantPerm: utils.Ptr([]int{3, 6}),
|
||
|
|
wantPers: utils.Ptr([]string{"single"}),
|
||
|
|
},
|
||
|
|
{
|
||
|
|
input: "disp:01/10 perm:3-6 persone:/single", // leading delimiter in persone
|
||
|
|
wantDisp: utils.Ptr(fmt.Sprintf("01/10/%d", time.Now().Year())),
|
||
|
|
wantPerm: utils.Ptr([]int{3, 6}),
|
||
|
|
wantPers: utils.Ptr([]string{"single"}),
|
||
|
|
},
|
||
|
|
{
|
||
|
|
input: "disp:01/10 perm:3-6 persone:single//coppia", // double delimiter in persone
|
||
|
|
wantDisp: utils.Ptr(fmt.Sprintf("01/10/%d", time.Now().Year())),
|
||
|
|
wantPerm: utils.Ptr([]int{3, 6}),
|
||
|
|
wantPers: utils.Ptr([]string{"single", "coppia"}),
|
||
|
|
},
|
||
|
|
{
|
||
|
|
input: "perm:3-6 persone:single", // disp missing
|
||
|
|
wantDisp: nil,
|
||
|
|
wantPerm: utils.Ptr([]int{3, 6}),
|
||
|
|
wantPers: utils.Ptr([]string{"single"}),
|
||
|
|
},
|
||
|
|
{
|
||
|
|
input: "disp:01/10 perm:3-6", // persone missing
|
||
|
|
wantDisp: utils.Ptr(fmt.Sprintf("01/10/%d", time.Now().Year())),
|
||
|
|
wantPerm: utils.Ptr([]int{3, 6}),
|
||
|
|
wantPers: nil,
|
||
|
|
},
|
||
|
|
{
|
||
|
|
input: "disp:01/10 perm: persone:", // perm empty
|
||
|
|
wantDisp: utils.Ptr(fmt.Sprintf("01/10/%d", time.Now().Year())),
|
||
|
|
wantPerm: nil,
|
||
|
|
wantPers: nil,
|
||
|
|
},
|
||
|
|
{
|
||
|
|
input: "", // completely empty string
|
||
|
|
wantDisp: nil,
|
||
|
|
wantPerm: nil,
|
||
|
|
wantPers: nil,
|
||
|
|
},
|
||
|
|
{
|
||
|
|
input: "disp: 01/10 perm: 3-6 persone: single ",
|
||
|
|
wantDisp: utils.Ptr(fmt.Sprintf("01/10/%d", time.Now().Year())),
|
||
|
|
wantPerm: utils.Ptr([]int{3, 6}),
|
||
|
|
wantPers: utils.Ptr([]string{"single"}),
|
||
|
|
},
|
||
|
|
{
|
||
|
|
input: "persone:single perm:3-6 disp:01/10",
|
||
|
|
wantDisp: utils.Ptr(fmt.Sprintf("01/10/%d", time.Now().Year())),
|
||
|
|
wantPerm: utils.Ptr([]int{3, 6}),
|
||
|
|
wantPers: utils.Ptr([]string{"single"}),
|
||
|
|
},
|
||
|
|
{
|
||
|
|
input: "disp:01/10 perm:3--6 persone:single",
|
||
|
|
wantDisp: utils.Ptr(fmt.Sprintf("01/10/%d", time.Now().Year())),
|
||
|
|
wantPerm: utils.Ptr([]int{3, 6}),
|
||
|
|
wantPers: utils.Ptr([]string{"single"}),
|
||
|
|
},
|
||
|
|
{
|
||
|
|
input: "disp:01/10\tperm:3-6\tpersone:single",
|
||
|
|
wantDisp: utils.Ptr(fmt.Sprintf("01/10/%d", time.Now().Year())),
|
||
|
|
wantPerm: utils.Ptr([]int{3, 6}),
|
||
|
|
wantPers: utils.Ptr([]string{"single"}),
|
||
|
|
},
|
||
|
|
{
|
||
|
|
input: "disp:01/10 perm:3-6 persone:single/coppia!",
|
||
|
|
wantDisp: utils.Ptr(fmt.Sprintf("01/10/%d", time.Now().Year())),
|
||
|
|
wantPerm: utils.Ptr([]int{3, 6}),
|
||
|
|
wantPers: utils.Ptr([]string{"single", "coppia!"}),
|
||
|
|
},
|
||
|
|
{
|
||
|
|
input: "disp:01/10 disp:02/11 perm:3-6 persone:single",
|
||
|
|
wantDisp: utils.Ptr(fmt.Sprintf("01/10/%d", time.Now().Year())), // Only first disp: is parsed
|
||
|
|
wantPerm: utils.Ptr([]int{3, 6}),
|
||
|
|
wantPers: utils.Ptr([]string{"single"}),
|
||
|
|
},
|
||
|
|
{
|
||
|
|
input: "disp:01/10perm:3-6persone:single",
|
||
|
|
wantDisp: utils.Ptr(fmt.Sprintf("01/10/%d", time.Now().Year())),
|
||
|
|
wantPerm: utils.Ptr([]int{3, 6}),
|
||
|
|
wantPers: utils.Ptr([]string{"single"}),
|
||
|
|
},
|
||
|
|
}
|
||
|
|
|
||
|
|
for _, tt := range tests {
|
||
|
|
disp_time, perm_arr, persone_arr, _ := parser.ParseDettaglio(tt.input)
|
||
|
|
|
||
|
|
//Handle *string comparison, including nil
|
||
|
|
if tt.wantDisp != nil {
|
||
|
|
if disp_time == nil {
|
||
|
|
t.Errorf("disp_time: got nil, want %v, input: %v", *tt.wantDisp, tt.input)
|
||
|
|
} else if *disp_time != *tt.wantDisp {
|
||
|
|
t.Errorf("disp_time: got %v, want %v, input: %v", *disp_time, *tt.wantDisp, tt.input)
|
||
|
|
}
|
||
|
|
} else if disp_time != nil {
|
||
|
|
t.Errorf("disp_time: got %v, want nil, input: %v", *disp_time, tt.input)
|
||
|
|
}
|
||
|
|
|
||
|
|
// Handle *[]int comparison, including nil
|
||
|
|
if tt.wantPerm != nil {
|
||
|
|
if perm_arr == nil || len(*perm_arr) != len(*tt.wantPerm) {
|
||
|
|
t.Errorf("perm_arr: got %v, want %v, input: %v", perm_arr, *tt.wantPerm, tt.input)
|
||
|
|
} else {
|
||
|
|
for i := range *perm_arr {
|
||
|
|
if (*perm_arr)[i] != (*tt.wantPerm)[i] {
|
||
|
|
t.Errorf("perm_arr[%d]: got %v, want %v, input: %v", i, (*perm_arr)[i], (*tt.wantPerm)[i], tt.input)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
} else if perm_arr != nil && len(*perm_arr) != 0 {
|
||
|
|
t.Errorf("perm_arr: got %v, want nil, input: %v", perm_arr, tt.input)
|
||
|
|
}
|
||
|
|
|
||
|
|
// Handle *[]string comparison, including nil
|
||
|
|
if tt.wantPers != nil {
|
||
|
|
if persone_arr == nil || len(*persone_arr) != len(*tt.wantPers) {
|
||
|
|
t.Errorf("persone_arr: got %v, want %v, input: %v", persone_arr, *tt.wantPers, tt.input)
|
||
|
|
} else {
|
||
|
|
for i := range *persone_arr {
|
||
|
|
if (*persone_arr)[i] != (*tt.wantPers)[i] {
|
||
|
|
t.Errorf("persone_arr[%d]: got %v, want %v, input: %v", i, (*persone_arr)[i], (*tt.wantPers)[i], tt.input)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
} else if persone_arr != nil && len(*persone_arr) != 0 {
|
||
|
|
t.Errorf("persone_arr: got %v, want nil, input: %v", persone_arr, tt.input)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestParseConsegna(t *testing.T) {
|
||
|
|
tests := []struct {
|
||
|
|
input *string
|
||
|
|
wantConsegna *int
|
||
|
|
}{
|
||
|
|
// Test all Italian month names
|
||
|
|
{
|
||
|
|
input: utils.Ptr("Gennaio"),
|
||
|
|
wantConsegna: utils.Ptr(1),
|
||
|
|
},
|
||
|
|
{
|
||
|
|
input: utils.Ptr("Febbraio"),
|
||
|
|
wantConsegna: utils.Ptr(2),
|
||
|
|
},
|
||
|
|
{
|
||
|
|
input: utils.Ptr("Marzo"),
|
||
|
|
wantConsegna: utils.Ptr(3),
|
||
|
|
},
|
||
|
|
{
|
||
|
|
input: utils.Ptr("Aprile"),
|
||
|
|
wantConsegna: utils.Ptr(4),
|
||
|
|
},
|
||
|
|
{
|
||
|
|
input: utils.Ptr("Maggio"),
|
||
|
|
wantConsegna: utils.Ptr(5),
|
||
|
|
},
|
||
|
|
{
|
||
|
|
input: utils.Ptr("Giugno"),
|
||
|
|
wantConsegna: utils.Ptr(6),
|
||
|
|
},
|
||
|
|
{
|
||
|
|
input: utils.Ptr("Luglio"),
|
||
|
|
wantConsegna: utils.Ptr(7),
|
||
|
|
},
|
||
|
|
{
|
||
|
|
input: utils.Ptr("Agosto"),
|
||
|
|
wantConsegna: utils.Ptr(8),
|
||
|
|
},
|
||
|
|
{
|
||
|
|
input: utils.Ptr("Settembre"),
|
||
|
|
wantConsegna: utils.Ptr(9),
|
||
|
|
},
|
||
|
|
{
|
||
|
|
input: utils.Ptr("Ottobre"),
|
||
|
|
wantConsegna: utils.Ptr(10),
|
||
|
|
},
|
||
|
|
{
|
||
|
|
input: utils.Ptr("Novembre"),
|
||
|
|
wantConsegna: utils.Ptr(11),
|
||
|
|
},
|
||
|
|
{
|
||
|
|
input: utils.Ptr("Dicembre"),
|
||
|
|
wantConsegna: utils.Ptr(12),
|
||
|
|
},
|
||
|
|
// Test "Libero" (should return current month)
|
||
|
|
{
|
||
|
|
input: utils.Ptr("Libero"),
|
||
|
|
wantConsegna: utils.Ptr(int(time.Now().Month())),
|
||
|
|
},
|
||
|
|
// Test nil input
|
||
|
|
{
|
||
|
|
input: nil,
|
||
|
|
wantConsegna: nil,
|
||
|
|
},
|
||
|
|
// Test empty string
|
||
|
|
{
|
||
|
|
input: utils.Ptr(""),
|
||
|
|
wantConsegna: utils.Ptr(int(time.Now().Month())),
|
||
|
|
},
|
||
|
|
// Test lowercase (should return current month as default)
|
||
|
|
{
|
||
|
|
input: utils.Ptr("gennaio"),
|
||
|
|
wantConsegna: utils.Ptr(int(time.Now().Month())),
|
||
|
|
},
|
||
|
|
// Test with spaces
|
||
|
|
{
|
||
|
|
input: utils.Ptr("Gennaio "),
|
||
|
|
wantConsegna: utils.Ptr(int(time.Now().Month())),
|
||
|
|
},
|
||
|
|
{
|
||
|
|
input: utils.Ptr(" Gennaio"),
|
||
|
|
wantConsegna: utils.Ptr(int(time.Now().Month())),
|
||
|
|
},
|
||
|
|
// Test with special characters
|
||
|
|
{
|
||
|
|
input: utils.Ptr("Gennaio!"),
|
||
|
|
wantConsegna: utils.Ptr(int(time.Now().Month())),
|
||
|
|
},
|
||
|
|
// Test abbreviated forms
|
||
|
|
{
|
||
|
|
input: utils.Ptr("Gen"),
|
||
|
|
wantConsegna: utils.Ptr(int(time.Now().Month())),
|
||
|
|
},
|
||
|
|
{
|
||
|
|
input: utils.Ptr("Feb"),
|
||
|
|
wantConsegna: utils.Ptr(int(time.Now().Month())),
|
||
|
|
},
|
||
|
|
// Test English month names
|
||
|
|
{
|
||
|
|
input: utils.Ptr("January"),
|
||
|
|
wantConsegna: utils.Ptr(int(time.Now().Month())),
|
||
|
|
},
|
||
|
|
// Test numeric strings
|
||
|
|
{
|
||
|
|
input: utils.Ptr("1"),
|
||
|
|
wantConsegna: utils.Ptr(int(time.Now().Month())),
|
||
|
|
},
|
||
|
|
// Test mixed cases
|
||
|
|
{
|
||
|
|
input: utils.Ptr("GEnNaIo"),
|
||
|
|
wantConsegna: utils.Ptr(int(time.Now().Month())),
|
||
|
|
},
|
||
|
|
// Test completely unrelated strings
|
||
|
|
{
|
||
|
|
input: utils.Ptr("NotAMonth"),
|
||
|
|
wantConsegna: utils.Ptr(int(time.Now().Month())),
|
||
|
|
},
|
||
|
|
}
|
||
|
|
|
||
|
|
for _, tt := range tests {
|
||
|
|
gotConsegna := parser.ParseConsegna(tt.input)
|
||
|
|
|
||
|
|
if tt.wantConsegna != nil {
|
||
|
|
if gotConsegna == nil {
|
||
|
|
t.Errorf("got nil, want %v, input: %v", *tt.wantConsegna, tt.input)
|
||
|
|
} else if *gotConsegna != *tt.wantConsegna {
|
||
|
|
t.Errorf("got %v, want %v, input: %v", *gotConsegna, *tt.wantConsegna, tt.input)
|
||
|
|
}
|
||
|
|
} else if gotConsegna != nil {
|
||
|
|
t.Errorf("got %v, want nil, input: %v", *gotConsegna, tt.input)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestParsePrezzo(t *testing.T) {
|
||
|
|
tests := []struct {
|
||
|
|
input *string
|
||
|
|
want int
|
||
|
|
}{
|
||
|
|
{input: utils.Ptr("100"), want: 10000},
|
||
|
|
{input: utils.Ptr("€ 100"), want: 10000},
|
||
|
|
{input: utils.Ptr("100€"), want: 10000},
|
||
|
|
{input: utils.Ptr("€100"), want: 10000},
|
||
|
|
{input: utils.Ptr("100 €"), want: 10000},
|
||
|
|
{input: utils.Ptr("€ 100,50"), want: 10050},
|
||
|
|
{input: utils.Ptr("100,50€"), want: 10050},
|
||
|
|
{input: utils.Ptr("€100,50"), want: 10050},
|
||
|
|
{input: utils.Ptr("100,50 €"), want: 10050},
|
||
|
|
{input: utils.Ptr("€ 1.000"), want: 100000},
|
||
|
|
{input: utils.Ptr("1.000€"), want: 100000},
|
||
|
|
{input: utils.Ptr("€1.000"), want: 100000},
|
||
|
|
{input: utils.Ptr("1.000 €"), want: 100000},
|
||
|
|
{input: utils.Ptr("€ 1.000,50"), want: 100050},
|
||
|
|
{input: utils.Ptr("1.000,50€"), want: 100050},
|
||
|
|
{input: utils.Ptr("€1.000,50"), want: 100050},
|
||
|
|
{input: utils.Ptr("1.000,50 €"), want: 100050},
|
||
|
|
}
|
||
|
|
|
||
|
|
for _, tt := range tests {
|
||
|
|
got := parser.ParsePrezzo(tt.input)
|
||
|
|
|
||
|
|
if got != tt.want {
|
||
|
|
inputStr := ""
|
||
|
|
if tt.input != nil {
|
||
|
|
inputStr = *tt.input
|
||
|
|
}
|
||
|
|
t.Errorf("got %v, want %v, input: %v", got, tt.want, inputStr)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestProcessTipologia(t *testing.T) {
|
||
|
|
tests := []struct {
|
||
|
|
t1, t2 *string
|
||
|
|
want *string
|
||
|
|
}{
|
||
|
|
{t1: utils.Ptr("V"), want: utils.Ptr("Vendita")},
|
||
|
|
{t1: utils.Ptr("I"), want: utils.Ptr("Cessione")},
|
||
|
|
{t1: utils.Ptr("A"), t2: utils.Ptr("Residenziale"), want: utils.Ptr("Transitorio")},
|
||
|
|
{t1: utils.Ptr("A"), t2: utils.Ptr("Turistico"), want: utils.Ptr("Transitorio")},
|
||
|
|
{t1: utils.Ptr("A"), t2: utils.Ptr("Stanza"), want: utils.Ptr("Transitorio")},
|
||
|
|
{t1: utils.Ptr("A"), t2: nil, want: utils.Ptr("Stabile")},
|
||
|
|
{t1: nil, want: utils.Ptr("Errore")},
|
||
|
|
// Unknown t1 value
|
||
|
|
{t1: utils.Ptr("X"), want: utils.Ptr("Errore")},
|
||
|
|
// Lowercase t1 value
|
||
|
|
{t1: utils.Ptr("v"), want: utils.Ptr("Errore")},
|
||
|
|
// t1 is empty string
|
||
|
|
{t1: utils.Ptr(""), want: utils.Ptr("Errore")},
|
||
|
|
// t2 is empty string with t1 == "A"
|
||
|
|
{t1: utils.Ptr("A"), t2: utils.Ptr(""), want: utils.Ptr("Stabile")},
|
||
|
|
// t2 is unknown value with t1 == "A"
|
||
|
|
{t1: utils.Ptr("A"), t2: utils.Ptr("Commerciale"), want: utils.Ptr("Stabile")},
|
||
|
|
// t2 is lowercase valid value with t1 == "A"
|
||
|
|
{t1: utils.Ptr("A"), t2: utils.Ptr("residenziale"), want: utils.Ptr("Transitorio")},
|
||
|
|
// t2 is uppercase valid value with t1 == "A"
|
||
|
|
{t1: utils.Ptr("A"), t2: utils.Ptr("RESIDENZIALE"), want: utils.Ptr("Transitorio")},
|
||
|
|
// t2 is "Stanza" with extra spaces
|
||
|
|
{t1: utils.Ptr("A"), t2: utils.Ptr(" Stanza "), want: utils.Ptr("Transitorio")},
|
||
|
|
}
|
||
|
|
|
||
|
|
for _, tt := range tests {
|
||
|
|
got := parser.ParseTipologia(tt.t1, tt.t2)
|
||
|
|
|
||
|
|
if got == nil || *got != *tt.want {
|
||
|
|
t.Errorf("got %v, want %v, input t1: %v, t2: %v", *got, *tt.want, *tt.t1, *tt.t2)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|