diff --git a/vlib/x/json2/encoder.v b/vlib/x/json2/encoder.v index b270f87c0c..cf617af133 100644 --- a/vlib/x/json2/encoder.v +++ b/vlib/x/json2/encoder.v @@ -186,7 +186,8 @@ fn (e &Encoder) encode_value_with_level[T](val T, level int, mut buf []u8) ! { } $else $if T is $enum { str_int := int(val).str() unsafe { buf.push_many(str_int.str, str_int.len) } - } $else $if T is $int || T is bool { + } $else $if T is $int || T is bool || T is i32 { + // bug? `i32` not in `$int`? str_int := val.str() unsafe { buf.push_many(str_int.str, str_int.len) } } $else $if T is $float { diff --git a/vlib/x/json2/json2.v b/vlib/x/json2/json2.v index 8713234cee..228816704d 100644 --- a/vlib/x/json2/json2.v +++ b/vlib/x/json2/json2.v @@ -101,7 +101,7 @@ pub fn (f Any) u8() u8 { u8 { return f } - u16, u32, i8, i16, i32, int, i64, f32, f64, bool { + u16, u32, u64, i8, i16, i32, int, i64, f32, f64, bool { return u8(u16(f)) } string { @@ -113,6 +113,42 @@ pub fn (f Any) u8() u8 { } } +// u16 uses `Any` as a 16-bit unsigned integer. +pub fn (f Any) u16() u16 { + match f { + u16 { + return f + } + u8, u32, u64, i8, i16, i32, int, i64, f32, f64, bool { + return u16(f) + } + string { + return f.u16() + } + else { + return 0 + } + } +} + +// u32 uses `Any` as a 32-bit unsigned integer. +pub fn (f Any) u32() u32 { + match f { + u32 { + return f + } + u8, u16, u64, i8, i16, i32, int, i64, f32, f64, bool { + return u32(f) + } + string { + return f.u32() + } + else { + return 0 + } + } +} + // u64 uses `Any` as a 64-bit unsigned integer. pub fn (f Any) u64() u64 { match f { diff --git a/vlib/x/json2/tests/any_test.v b/vlib/x/json2/tests/any_test.v index 003b1d11d0..a232f35e9d 100644 --- a/vlib/x/json2/tests/any_test.v +++ b/vlib/x/json2/tests/any_test.v @@ -1,9 +1,16 @@ import x.json2 as json const sample_data = { - 'int': json.Any(int(1)) - 'i64': json.Any(i64(128)) - 'f32': json.Any(f32(2.0)) + 'u8': json.Any(u8(1)) + 'u16': json.Any(u16(2)) + 'u32': json.Any(u32(3)) + 'u64': json.Any(u64(4)) + 'i8': json.Any(i8(5)) + 'i16': json.Any(i16(6)) + 'i32': json.Any(i32(7)) + 'int': json.Any(int(8)) + 'i64': json.Any(i64(9)) + 'f32': json.Any(f32(2.3)) 'f64': json.Any(f64(1.283)) 'bool': json.Any(false) 'str': json.Any('test') @@ -23,9 +30,16 @@ fn is_null(f json.Any) bool { fn test_f32() { // valid conversions - assert sample_data['int'] or { 0 }.f32() == 1.0 - assert sample_data['i64'] or { 0 }.f32() == 128.0 - assert sample_data['f32'] or { 0 }.f32() == 2.0 + assert sample_data['u8'] or { 0 }.f32() == 1.0 + assert sample_data['u16'] or { 0 }.f32() == 2.0 + assert sample_data['u32'] or { 0 }.f32() == 3.0 + assert sample_data['u64'] or { 0 }.f32() == 4.0 + assert sample_data['i8'] or { 0 }.f32() == 5.0 + assert sample_data['i16'] or { 0 }.f32() == 6.0 + assert sample_data['i32'] or { 0 }.f32() == 7.0 + assert sample_data['int'] or { 0 }.f32() == 8.0 + assert sample_data['i64'] or { 0 }.f32() == 9.0 + assert sample_data['f32'] or { 0 }.f32() == 2.3 assert sample_data['f64'] or { 0 }.f32() == 1.2829999923706055 // invalid conversions assert sample_data['bool'] or { 0 }.f32() == 0.0 @@ -37,9 +51,16 @@ fn test_f32() { fn test_f64() { // valid conversions - assert sample_data['int'] or { 0 }.f64() == 1.0 - assert sample_data['i64'] or { 0 }.f64() == 128.0 - assert sample_data['f32'] or { 0 }.f64() == 2.0 + assert sample_data['u8'] or { 0 }.f64() == 1.0 + assert sample_data['u16'] or { 0 }.f64() == 2.0 + assert sample_data['u32'] or { 0 }.f64() == 3.0 + assert sample_data['u64'] or { 0 }.f64() == 4.0 + assert sample_data['i8'] or { 0 }.f64() == 5.0 + assert sample_data['i16'] or { 0 }.f64() == 6.0 + assert sample_data['i32'] or { 0 }.f64() == 7.0 + assert sample_data['int'] or { 0 }.f64() == 8.0 + assert sample_data['i64'] or { 0 }.f64() == 9.0 + assert sample_data['f32'] or { 0 }.f64() == 2.299999952316284 assert sample_data['f64'] or { 0 }.f64() == 1.283 // invalid conversions assert sample_data['bool'] or { 0 }.f64() == 0.0 @@ -49,10 +70,80 @@ fn test_f64() { assert sample_data['obj'] or { 0 }.f64() == 0.0 } +fn test_i8() { + // valid conversions + assert sample_data['u8'] or { 0 }.i8() == 1 + assert sample_data['u16'] or { 0 }.i8() == 2 + assert sample_data['u32'] or { 0 }.i8() == 3 + assert sample_data['u64'] or { 0 }.i8() == 4 + assert sample_data['i8'] or { 0 }.i8() == 5 + assert sample_data['i16'] or { 0 }.i8() == 6 + assert sample_data['i32'] or { 0 }.i8() == 7 + assert sample_data['int'] or { 0 }.i8() == 8 + assert sample_data['i64'] or { 0 }.i8() == 9 + assert sample_data['f32'] or { 0 }.i8() == 2 + assert sample_data['f64'] or { 0 }.i8() == 1 + assert json.Any(true).i8() == 1 + assert json.Any('123').i8() == 123 + // invalid conversions + assert sample_data['null'] or { 0 }.i8() == 0 + assert sample_data['arr'] or { 0 }.i8() == 0 + assert sample_data['obj'] or { 0 }.i8() == 0 +} + +fn test_i16() { + // valid conversions + assert sample_data['u8'] or { 0 }.i16() == 1 + assert sample_data['u16'] or { 0 }.i16() == 2 + assert sample_data['u32'] or { 0 }.i16() == 3 + assert sample_data['u64'] or { 0 }.i16() == 4 + assert sample_data['i8'] or { 0 }.i16() == 5 + assert sample_data['i16'] or { 0 }.i16() == 6 + assert sample_data['i32'] or { 0 }.i16() == 7 + assert sample_data['int'] or { 0 }.i16() == 8 + assert sample_data['i64'] or { 0 }.i16() == 9 + assert sample_data['f32'] or { 0 }.i16() == 2 + assert sample_data['f64'] or { 0 }.i16() == 1 + assert json.Any(true).i16() == 1 + assert json.Any('123').i16() == 123 + // invalid conversions + assert sample_data['null'] or { 0 }.i16() == 0 + assert sample_data['arr'] or { 0 }.i16() == 0 + assert sample_data['obj'] or { 0 }.i16() == 0 +} + +fn test_i32() { + // valid conversions + assert sample_data['u8'] or { 0 }.i32() == 1 + assert sample_data['u16'] or { 0 }.i32() == 2 + assert sample_data['u32'] or { 0 }.i32() == 3 + assert sample_data['u64'] or { 0 }.i32() == 4 + assert sample_data['i8'] or { 0 }.i32() == 5 + assert sample_data['i16'] or { 0 }.i32() == 6 + assert sample_data['i32'] or { 0 }.i32() == 7 + assert sample_data['int'] or { 0 }.i32() == 8 + assert sample_data['i64'] or { 0 }.i32() == 9 + assert sample_data['f32'] or { 0 }.i32() == 2 + assert sample_data['f64'] or { 0 }.i32() == 1 + assert json.Any(true).i32() == 1 + assert json.Any('123').i32() == 123 + // invalid conversions + assert sample_data['null'] or { 0 }.i32() == 0 + assert sample_data['arr'] or { 0 }.i32() == 0 + assert sample_data['obj'] or { 0 }.i32() == 0 +} + fn test_int() { // valid conversions - assert sample_data['int'] or { 0 }.int() == 1 - assert sample_data['i64'] or { 0 }.int() == 128 + assert sample_data['u8'] or { 0 }.int() == 1 + assert sample_data['u16'] or { 0 }.int() == 2 + assert sample_data['u32'] or { 0 }.int() == 3 + assert sample_data['u64'] or { 0 }.int() == 4 + assert sample_data['i8'] or { 0 }.int() == 5 + assert sample_data['i16'] or { 0 }.int() == 6 + assert sample_data['i32'] or { 0 }.int() == 7 + assert sample_data['int'] or { 0 }.int() == 8 + assert sample_data['i64'] or { 0 }.int() == 9 assert sample_data['f32'] or { 0 }.int() == 2 assert sample_data['f64'] or { 0 }.int() == 1 assert json.Any(true).int() == 1 @@ -65,8 +156,15 @@ fn test_int() { fn test_i64() { // valid conversions - assert sample_data['int'] or { 0 }.i64() == 1 - assert sample_data['i64'] or { 0 }.i64() == 128 + assert sample_data['u8'] or { 0 }.i64() == 1 + assert sample_data['u16'] or { 0 }.i64() == 2 + assert sample_data['u32'] or { 0 }.i64() == 3 + assert sample_data['u64'] or { 0 }.i64() == 4 + assert sample_data['i8'] or { 0 }.i64() == 5 + assert sample_data['i16'] or { 0 }.i64() == 6 + assert sample_data['i32'] or { 0 }.i64() == 7 + assert sample_data['int'] or { 0 }.i64() == 8 + assert sample_data['i64'] or { 0 }.i64() == 9 assert sample_data['f32'] or { 0 }.i64() == 2 assert sample_data['f64'] or { 0 }.i64() == 1 assert json.Any(true).i64() == 1 @@ -77,10 +175,101 @@ fn test_i64() { assert sample_data['obj'] or { 0 }.i64() == 0 } +fn test_u8() { + // valid conversions + assert sample_data['u8'] or { 0 }.u8() == 1 + assert sample_data['u16'] or { 0 }.u8() == 2 + assert sample_data['u32'] or { 0 }.u8() == 3 + assert sample_data['u64'] or { 0 }.u8() == 4 + assert sample_data['i8'] or { 0 }.u8() == 5 + assert sample_data['i16'] or { 0 }.u8() == 6 + assert sample_data['i32'] or { 0 }.u8() == 7 + assert sample_data['int'] or { 0 }.u8() == 8 + assert sample_data['i64'] or { 0 }.u8() == 9 + assert sample_data['f32'] or { 0 }.u8() == 2 + assert sample_data['f64'] or { 0 }.u8() == 1 + assert json.Any(true).u8() == 1 + assert json.Any('123').u8() == 123 + // invalid conversions + assert sample_data['null'] or { 0 }.u8() == 0 + assert sample_data['arr'] or { 0 }.u8() == 0 + assert sample_data['obj'] or { 0 }.u8() == 0 +} + +fn test_u16() { + // valid conversions + assert sample_data['u8'] or { 0 }.u16() == 1 + assert sample_data['u16'] or { 0 }.u16() == 2 + assert sample_data['u32'] or { 0 }.u16() == 3 + assert sample_data['u64'] or { 0 }.u16() == 4 + assert sample_data['i8'] or { 0 }.u16() == 5 + assert sample_data['i16'] or { 0 }.u16() == 6 + assert sample_data['i32'] or { 0 }.u16() == 7 + assert sample_data['int'] or { 0 }.u16() == 8 + assert sample_data['i64'] or { 0 }.u16() == 9 + assert sample_data['f32'] or { 0 }.u16() == 2 + assert sample_data['f64'] or { 0 }.u16() == 1 + assert json.Any(true).u16() == 1 + assert json.Any('123').u16() == 123 + // invalid conversions + assert sample_data['null'] or { 0 }.u16() == 0 + assert sample_data['arr'] or { 0 }.u16() == 0 + assert sample_data['obj'] or { 0 }.u16() == 0 +} + +fn test_u32() { + // valid conversions + assert sample_data['u8'] or { 0 }.u32() == 1 + assert sample_data['u16'] or { 0 }.u32() == 2 + assert sample_data['u32'] or { 0 }.u32() == 3 + assert sample_data['u64'] or { 0 }.u32() == 4 + assert sample_data['i8'] or { 0 }.u32() == 5 + assert sample_data['i16'] or { 0 }.u32() == 6 + assert sample_data['i32'] or { 0 }.u32() == 7 + assert sample_data['int'] or { 0 }.u32() == 8 + assert sample_data['i64'] or { 0 }.u32() == 9 + assert sample_data['f32'] or { 0 }.u32() == 2 + assert sample_data['f64'] or { 0 }.u32() == 1 + assert json.Any(true).u32() == 1 + assert json.Any('123').u32() == 123 + // invalid conversions + assert sample_data['null'] or { 0 }.u32() == 0 + assert sample_data['arr'] or { 0 }.u32() == 0 + assert sample_data['obj'] or { 0 }.u32() == 0 +} + +fn test_u64() { + // valid conversions + assert sample_data['u8'] or { 0 }.u64() == 1 + assert sample_data['u16'] or { 0 }.u64() == 2 + assert sample_data['u32'] or { 0 }.u64() == 3 + assert sample_data['u64'] or { 0 }.u64() == 4 + assert sample_data['i8'] or { 0 }.u64() == 5 + assert sample_data['i16'] or { 0 }.u64() == 6 + assert sample_data['i32'] or { 0 }.u64() == 7 + assert sample_data['int'] or { 0 }.u64() == 8 + assert sample_data['i64'] or { 0 }.u64() == 9 + assert sample_data['f32'] or { 0 }.u64() == 2 + assert sample_data['f64'] or { 0 }.u64() == 1 + assert json.Any(true).u64() == 1 + assert json.Any('123').u64() == 123 + // invalid conversions + assert sample_data['null'] or { 0 }.u64() == 0 + assert sample_data['arr'] or { 0 }.u64() == 0 + assert sample_data['obj'] or { 0 }.u64() == 0 +} + fn test_as_map() { - assert sample_data['int'] or { 0 }.as_map()['0'] or { 0 }.int() == 1 - assert sample_data['i64'] or { 0 }.as_map()['0'] or { 0 }.i64() == 128.0 - assert sample_data['f32'] or { 0 }.as_map()['0'] or { 0 }.f32() == 2.0 + assert sample_data['u8'] or { 0 }.as_map()['0'] or { 0 }.u8() == 1 + assert sample_data['u16'] or { 0 }.as_map()['0'] or { 0 }.u16() == 2 + assert sample_data['u32'] or { 0 }.as_map()['0'] or { 0 }.u32() == 3 + assert sample_data['u64'] or { 0 }.as_map()['0'] or { 0 }.u64() == 4 + assert sample_data['i8'] or { 0 }.as_map()['0'] or { 0 }.i8() == 5 + assert sample_data['i16'] or { 0 }.as_map()['0'] or { 0 }.i16() == 6 + assert sample_data['i32'] or { 0 }.as_map()['0'] or { 0 }.i32() == 7 + assert sample_data['int'] or { 0 }.as_map()['0'] or { 0 }.int() == 8 + assert sample_data['i64'] or { 0 }.as_map()['0'] or { 0 }.i64() == 9 + assert sample_data['f32'] or { 0 }.as_map()['0'] or { 0 }.f32() == 2.3 assert sample_data['f64'] or { 0 }.as_map()['0'] or { 0 }.f64() == 1.283 assert sample_data['bool'] or { 0 }.as_map()['0'] or { 0 }.bool() == false assert sample_data['str'] or { 0 }.as_map()['0'] or { 0 }.str() == 'test' @@ -99,9 +288,16 @@ fn test_as_map_of_strings() { } fn test_arr() { - assert sample_data['int'] or { 0 }.arr()[0].int() == 1 - assert sample_data['i64'] or { 0 }.arr()[0].i64() == 128.0 - assert sample_data['f32'] or { 0 }.arr()[0].f32() == 2.0 + assert sample_data['u8'] or { 0 }.arr()[0].u8() == 1 + assert sample_data['u16'] or { 0 }.arr()[0].u16() == 2 + assert sample_data['u32'] or { 0 }.arr()[0].u32() == 3 + assert sample_data['u64'] or { 0 }.arr()[0].u64() == 4 + assert sample_data['i8'] or { 0 }.arr()[0].i8() == 5 + assert sample_data['i16'] or { 0 }.arr()[0].i16() == 6 + assert sample_data['i32'] or { 0 }.arr()[0].i32() == 7 + assert sample_data['int'] or { 0 }.arr()[0].int() == 8 + assert sample_data['i64'] or { 0 }.arr()[0].i64() == 9 + assert sample_data['f32'] or { 0 }.arr()[0].f32() == 2.3 assert sample_data['f64'] or { 0 }.arr()[0].f64() == 1.283 assert sample_data['bool'] or { 0 }.arr()[0].bool() == false assert sample_data['str'] or { 0 }.arr()[0].str() == 'test' @@ -114,6 +310,13 @@ fn test_bool() { // valid conversions assert sample_data['bool'] or { 0 }.bool() == false assert json.Any('true').bool() == true + assert sample_data['u8'] or { 0 }.bool() == true + assert sample_data['u16'] or { 0 }.bool() == true + assert sample_data['u32'] or { 0 }.bool() == true + assert sample_data['u64'] or { 0 }.bool() == true + assert sample_data['i8'] or { 0 }.bool() == true + assert sample_data['i16'] or { 0 }.bool() == true + assert sample_data['i32'] or { 0 }.bool() == true assert sample_data['int'] or { 0 }.bool() == true assert sample_data['i64'] or { 0 }.bool() == true assert sample_data['f32'] or { 0 }.bool() == true @@ -125,13 +328,20 @@ fn test_bool() { } fn test_str() { - assert sample_data['int'] or { 0 }.str() == '1' - assert sample_data['i64'] or { 0 }.str() == '128' - assert sample_data['f32'] or { 0 }.str() == '2' + assert sample_data['u8'] or { 0 }.str() == '1' + assert sample_data['u16'] or { 0 }.str() == '2' + assert sample_data['u32'] or { 0 }.str() == '3' + assert sample_data['u64'] or { 0 }.str() == '4' + assert sample_data['i8'] or { 0 }.str() == '5' + assert sample_data['i16'] or { 0 }.str() == '6' + assert sample_data['i32'] or { 0 }.str() == '7' + assert sample_data['int'] or { 0 }.str() == '8' + assert sample_data['i64'] or { 0 }.str() == '9' + assert sample_data['f32'] or { 0 }.str() == '2.299999952316284' assert sample_data['f64'] or { 0 }.str() == '1.283' assert sample_data['bool'] or { 0 }.str() == 'false' assert sample_data['str'] or { 0 }.str() == 'test' assert sample_data['null'] or { 0 }.str() == 'null' assert sample_data['arr'] or { 'not lol' }.str() == '["lol"]' - assert sample_data.str() == '{"int":1,"i64":128,"f32":2,"f64":1.283,"bool":false,"str":"test","null":null,"arr":["lol"],"obj":{"foo":10}}' + assert sample_data.str() == '{"u8":1,"u16":2,"u32":3,"u64":4,"i8":5,"i16":6,"i32":7,"int":8,"i64":9,"f32":2.299999952316284,"f64":1.283,"bool":false,"str":"test","null":null,"arr":["lol"],"obj":{"foo":10}}' }