1
0
mirror of https://github.com/vlang/v.git synced 2023-08-10 21:13:21 +03:00
v/vlib/compiler/tests/struct_test.v

251 lines
3.6 KiB
V
Raw Normal View History

struct Aa {
mut:
2020-03-27 10:46:54 +03:00
val int
nums []int
}
struct Bb {
mut:
a Aa
}
struct Cu {
mut:
b Bb
nums []int
aarr []Aa
2020-03-27 10:46:54 +03:00
num int
}
struct User {
name string
2020-03-27 10:46:54 +03:00
age int
}
2019-07-24 03:22:34 +03:00
struct Foo {
@type string
}
2020-03-27 10:46:54 +03:00
struct Empty {}
2020-03-27 10:46:54 +03:00
// We need to make sure that this compiles with all the reserved names.
struct ReservedKeywords {
delete int
exit int
unix int
error int
malloc int
2020-03-27 10:46:54 +03:00
calloc int
free int
panic int
auto int
char int
do int
double int
extern int
float int
inline int
long int
register int
restrict int
short int
signed int
typedef int
unsigned int
void int
volatile int
while int
}
fn test_empty_struct() {
d := &Empty{}
println(d) // != voidptr(0)
println(sizeof(Empty)) // == 0
}
fn test_struct_levels() {
mut c := Cu{}
2020-03-27 10:46:54 +03:00
println(c.nums.len)
assert c.nums.len == 0
c.nums << 3
assert c.nums.len == 1
assert c.nums[0] == 3
c.nums[0] = 4
assert c.nums[0] == 4
c.b.a.val = 34
assert c.b.a.val == 34
c.b.a.nums = [0].repeat(0)
c.b.a.nums << 0
c.b.a.nums << 2
assert c.b.a.nums.len == 2
assert c.b.a.nums[0] == 0
assert c.b.a.nums[1] == 2
2020-03-27 10:46:54 +03:00
c.b.a.nums[0] = 7
assert c.b.a.nums[0] == 7
c.aarr << Aa{
2020-03-27 10:46:54 +03:00
val: 8
}
assert c.aarr.len == 1
assert c.aarr[0].val == 8
c.num = 20
assert c.num == 20
2020-03-27 10:46:54 +03:00
c.aarr[0].val = 10
assert c.aarr[0].val == 10
}
fn test_struct_str() {
2020-03-27 10:46:54 +03:00
u := User{
'Bob',30}
println(u) // make sure the struct is printable
// assert u.str() == '{name:"Bob", age:30}' // TODO
}
2019-07-24 03:22:34 +03:00
fn test_at() {
2020-03-27 10:46:54 +03:00
foo := Foo{
@type: 'test'
}
println(foo.@type)
}
fn test_reserved_keywords() {
2020-03-27 10:46:54 +03:00
// Make sure we can initialize them correctly using full syntax.
rk_holder := ReservedKeywords{
0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3}
// Test a few as it'll take too long to test all. If it's initialized
// correctly, other fields are also probably valid.
assert rk_holder.unix == 5
assert rk_holder.while == 3
2020-03-27 10:46:54 +03:00
rk_holder2 := ReservedKeywords{
inline: 9
volatile: 11
}
// Make sure partial initialization works too.
assert rk_holder2.inline == 9
assert rk_holder2.volatile == 11
2020-03-27 10:46:54 +03:00
assert rk_holder2.while == 0 // Zero value as not specified.
}
2019-10-13 01:50:15 +03:00
struct User2 {
mut:
name string
2019-11-26 06:41:56 +03:00
}
2019-10-13 01:50:15 +03:00
fn test_mutable_fields() {
mut u := User2{}
u.name = 'Peter'
assert u.name == 'Peter'
2019-11-26 06:41:56 +03:00
}
2019-11-24 15:56:14 +03:00
struct Def {
a int
2020-03-27 10:46:54 +03:00
b int=7
2019-11-26 06:41:56 +03:00
}
2019-11-24 15:56:14 +03:00
fn test_default_vals() {
d := Def{}
assert d.a == 0
assert d.b == 7
2020-03-27 10:46:54 +03:00
d2 := Def{
10,20}
2019-11-24 15:56:14 +03:00
assert d2.a == 10
assert d2.b == 20
2019-11-26 06:41:56 +03:00
}
fn test_assoc_with_vars() {
2020-03-27 10:46:54 +03:00
def2 := Def{
a: 12
}
merged := {
def2 |
a:42
}
2019-11-26 06:41:56 +03:00
assert merged.a == 42
assert merged.b == 7
}
const (
2020-03-27 10:46:54 +03:00
const_def = Def{
a: 100
}
2019-11-26 06:41:56 +03:00
)
2020-03-27 10:46:54 +03:00
2019-11-26 06:41:56 +03:00
fn test_assoc_with_constants() {
2020-03-27 10:46:54 +03:00
println(1)
/*
QTODO
2019-11-26 06:41:56 +03:00
merged := { const_def | a: 42 }
assert merged.a == 42
assert merged.b == 7
again := { const_def | b: 22 }
assert again.a == 100
assert again.b == 22
2020-03-27 10:46:54 +03:00
*/
2019-11-26 06:41:56 +03:00
}
2019-11-24 15:56:14 +03:00
2020-03-27 10:46:54 +03:00
struct AttrTest {
a int // private immutable (default)
mut:
2020-03-27 10:46:54 +03:00
b int // private mutable
c int // (you can list multiple fields with the same access modifier)
pub:
2020-03-27 10:46:54 +03:00
d int // public immmutable (readonly)
pub mut:
2020-03-27 10:46:54 +03:00
e int // public, but mutable only in parent module
2019-12-13 20:28:28 +03:00
__global:
2020-03-27 10:46:54 +03:00
f int // public and mutable both inside and outside parent module
}
2020-03-27 10:46:54 +03:00
fn fooo() {
a := AttrTest{
1,2,3,4,5,6}
}
2019-12-12 13:51:05 +03:00
/*
[typedef]
struct C.fixed {
points [10]C.point
}
[typedef]
struct C.point {
x int
y int
}
fn test_fixed_field() {
f := &C.fixed{}
p := f.points[0]
//f.nums[0] = 10
//println(f.nums[0])
println(p.x)
//nums: [10]int
//}
}
*/
2020-01-24 20:57:32 +03:00
struct Config {
2020-03-27 10:46:54 +03:00
n int
def int=10
2020-01-24 20:57:32 +03:00
}
2020-03-27 10:46:54 +03:00
fn foo_config(c Config) {}
2020-01-24 20:57:32 +03:00
2020-03-27 10:46:54 +03:00
fn foo2(u User) {}
2020-01-24 20:57:32 +03:00
fn test_config() {
2020-03-27 10:46:54 +03:00
/*
foo_config({
n: 10
def: 20
})
2020-01-24 20:57:32 +03:00
foo_config({})
2020-03-27 10:46:54 +03:00
foo2({
name: 'Peter'
})
*/
2020-01-24 20:57:32 +03:00
}