116 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			V
		
	
	
			
		
		
	
	
			116 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			V
		
	
	
import json
 | 
						|
 | 
						|
enum JobTitle {
 | 
						|
	manager
 | 
						|
	executive
 | 
						|
	worker
 | 
						|
}
 | 
						|
 | 
						|
struct Employee {
 | 
						|
	name string
 | 
						|
	age  int
 | 
						|
	salary f32
 | 
						|
	title JobTitle
 | 
						|
}
 | 
						|
 | 
						|
fn test_simple() {
 | 
						|
	x := Employee{'Peter', 28, 95000.5, .worker}
 | 
						|
	s := json.encode(x)
 | 
						|
	eprintln('Employee x: $s')
 | 
						|
	assert s == '{"name":"Peter","age":28,"salary":95000.5,"title":2}'
 | 
						|
	y := json.decode(Employee, s) or {
 | 
						|
		assert false
 | 
						|
		Employee{}
 | 
						|
	}
 | 
						|
	eprintln('Employee y: $y')
 | 
						|
	assert y.name == 'Peter'
 | 
						|
	assert y.age == 28
 | 
						|
	assert y.salary == 95000.5
 | 
						|
	assert y.title == .worker
 | 
						|
}
 | 
						|
 | 
						|
struct User2 {
 | 
						|
	age  int
 | 
						|
	nums []int
 | 
						|
}
 | 
						|
 | 
						|
struct User {
 | 
						|
	age           int
 | 
						|
	nums          []int
 | 
						|
	last_name     string [json:lastName]
 | 
						|
	is_registered bool   [json:IsRegistered]
 | 
						|
	typ           int    [json:'type']
 | 
						|
	pets          string [raw; json:'pet_animals']
 | 
						|
}
 | 
						|
 | 
						|
fn test_parse_user() {
 | 
						|
	s := '{"age": 10, "nums": [1,2,3], "type": 1, "lastName": "Johnson", "IsRegistered": true, "pet_animals": {"name": "Bob", "animal": "Dog"}}'
 | 
						|
	u2 := json.decode(User2, s) or {
 | 
						|
		exit(1)
 | 
						|
	}
 | 
						|
	println(u2)
 | 
						|
	u := json.decode(User, s) or {
 | 
						|
		exit(1)
 | 
						|
	}
 | 
						|
	println(u)
 | 
						|
	assert u.age == 10
 | 
						|
	assert u.last_name == 'Johnson'
 | 
						|
	assert u.is_registered == true
 | 
						|
	assert u.nums.len == 3
 | 
						|
	assert u.nums[0] == 1
 | 
						|
	assert u.nums[1] == 2
 | 
						|
	assert u.nums[2] == 3
 | 
						|
	assert u.typ == 1
 | 
						|
	assert u.pets == '{"name":"Bob","animal":"Dog"}'
 | 
						|
}
 | 
						|
 | 
						|
fn test_encode_user() {
 | 
						|
	usr := User{
 | 
						|
		age: 10
 | 
						|
		nums: [1, 2, 3]
 | 
						|
		last_name: 'Johnson'
 | 
						|
		is_registered: true
 | 
						|
		typ: 0
 | 
						|
		pets: 'foo'
 | 
						|
	}
 | 
						|
	expected := '{"age":10,"nums":[1,2,3],"lastName":"Johnson","IsRegistered":true,"type":0,"pet_animals":"foo"}'
 | 
						|
	out := json.encode(usr)
 | 
						|
	println(out)
 | 
						|
	assert out == expected
 | 
						|
}
 | 
						|
 | 
						|
struct Color {
 | 
						|
	space string
 | 
						|
	point string [raw]
 | 
						|
}
 | 
						|
 | 
						|
fn test_raw_json_field() {
 | 
						|
	color := json.decode(Color, '{"space": "YCbCr", "point": {"Y": 123}}') or {
 | 
						|
		println('text')
 | 
						|
		return
 | 
						|
	}
 | 
						|
	assert color.point == '{"Y":123}'
 | 
						|
	assert color.space == 'YCbCr'
 | 
						|
}
 | 
						|
 | 
						|
struct City {
 | 
						|
	name string
 | 
						|
}
 | 
						|
 | 
						|
struct Country {
 | 
						|
	cities []City
 | 
						|
	name   string
 | 
						|
}
 | 
						|
 | 
						|
fn test_struct_in_struct() {
 | 
						|
	country := json.decode(Country, '{ "name": "UK", "cities": [{"name":"London"}, {"name":"Manchester"}]}') or {
 | 
						|
		assert false
 | 
						|
		exit(1)
 | 
						|
	}
 | 
						|
	assert country.name == 'UK'
 | 
						|
	assert country.cities.len == 2
 | 
						|
	assert country.cities[0].name == 'London'
 | 
						|
	assert country.cities[1].name == 'Manchester'
 | 
						|
	println(country.cities)
 | 
						|
}
 |