Skip to content
This repository was archived by the owner on Jul 6, 2019. It is now read-only.

Commit 11b6e7a

Browse files
committed
ioreg: Add simple testcases
1 parent 6dcbbd3 commit 11b6e7a

File tree

2 files changed

+139
-0
lines changed

2 files changed

+139
-0
lines changed

Rakefile

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,12 @@ compile_rust :macro_ioreg, {
5858
build_for: :host,
5959
}
6060

61+
rust_tests :ioreg_test, {
62+
source: 'ioreg/test.rs'.in_root,
63+
deps: [:core_crate, :macro_ioreg, :shiny_crate],
64+
produce: 'ioreg_test'.in_build,
65+
}
66+
6167
# zinc crate
6268
compile_rust :zinc_crate, {
6369
source: 'main.rs'.in_source,

ioreg/test.rs

Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
// Zinc, the bare metal stack for rust.
2+
// Copyright 2014 Ben Gamari <[email protected]>
3+
//
4+
// Licensed under the Apache License, Version 2.0 (the "License");
5+
// you may not use this file except in compliance with the License.
6+
// You may obtain a copy of the License at
7+
//
8+
// http://www.apache.org/licenses/LICENSE-2.0
9+
//
10+
// Unless required by applicable law or agreed to in writing, software
11+
// distributed under the License is distributed on an "AS IS" BASIS,
12+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
// See the License for the specific language governing permissions and
14+
// limitations under the License.
15+
16+
//! Tests for ioreg! syntax extension
17+
18+
#![feature(phase)]
19+
#[phase(plugin)] extern crate macro_ioreg;
20+
#[phase(plugin,link)] extern crate shiny;
21+
extern crate core;
22+
23+
24+
#[allow(dead_code)]
25+
#[path="../src/lib/volatile_cell.rs"] mod volatile_cell;
26+
27+
#[cfg(test)]
28+
mod test {
29+
use std::mem::{transmute, zeroed};
30+
use std::ptr::RawPtr;
31+
use volatile_cell::VolatileCell;
32+
33+
fn get_value<'a, T>(v: &'a T, offset: uint) -> u32 {
34+
unsafe {
35+
let ptr: *const u32 = transmute(v);
36+
*(ptr.offset(offset as int))
37+
}
38+
}
39+
40+
fn zeroed_safe<T: Copy>() -> T {
41+
unsafe {
42+
return zeroed();
43+
}
44+
}
45+
46+
ioregs!(BASIC_TEST = {
47+
0x0 => reg32 reg1 {
48+
0 => field1,
49+
1..3 => field2,
50+
16..24 => field3,
51+
25 => field4: set_to_clear,
52+
}
53+
0x4 => reg32 reg2 {
54+
0 => field1,
55+
}
56+
})
57+
58+
describe!(
59+
before_each {
60+
let test: BASIC_TEST = zeroed_safe();
61+
}
62+
63+
it "can round_trip simple field values (1)" {
64+
test.reg1.set_field1(true);
65+
assert_eq!(test.reg1.field1(), true)
66+
assert_eq!(get_value(&test, 0), 1)
67+
assert_eq!(get_value(&test, 1), 0)
68+
}
69+
70+
it "can round trip simple field values (2)" {
71+
test.reg1.set_field3(0xde);
72+
assert_eq!(test.reg1.field3(), 0xde)
73+
assert_eq!(get_value(&test, 0), 0xde<<16)
74+
}
75+
76+
it "sets set_to_clear fields" {
77+
test.reg1.clear_field4();
78+
assert_eq!(get_value(&test, 0), 1<<25)
79+
}
80+
)
81+
82+
ioregs!(GROUP_TEST = {
83+
0x0 => group regs[5] {
84+
0x0 => reg32 reg1 {
85+
0..31 => field1
86+
}
87+
0x4 => reg32 reg2 {
88+
0..31 => field2
89+
}
90+
}
91+
})
92+
93+
describe!(
94+
before_each {
95+
let test: GROUP_TEST = zeroed_safe();
96+
}
97+
98+
it "sets groups correctly" {
99+
test.regs[0].reg1.set_field1(0xdeadbeef);
100+
assert_eq!(test.regs[0].reg1.field1(), 0xdeadbeef)
101+
assert_eq!(get_value(&test, 0), 0xdeadbeef)
102+
for i in range(1, 10) {
103+
assert_eq!(get_value(&test, i), 0)
104+
}
105+
106+
test.regs[2].reg2.set_field2(0xfeedbeef);
107+
assert_eq!(test.regs[2].reg2.field2(), 0xfeedbeef)
108+
assert_eq!(get_value(&test, 5), 0xfeedbeef)
109+
}
110+
)
111+
112+
ioregs!(FIELD_ARRAY_TEST = {
113+
0x0 => reg32 reg1 {
114+
0..31 => field[16]
115+
}
116+
})
117+
118+
describe!(
119+
before_each {
120+
let test: FIELD_ARRAY_TEST = zeroed_safe();
121+
}
122+
123+
it "sets field arrays correctly" {
124+
test.reg1.set_field(0, 1);
125+
assert_eq!(test.reg1.field(0), 1);
126+
assert_eq!(get_value(&test, 0), 0x1)
127+
128+
test.reg1.set_field(4, 3);
129+
assert_eq!(test.reg1.field(4), 3);
130+
assert_eq!(get_value(&test, 0), 0x1 | 0x3<<8)
131+
}
132+
)
133+
}

0 commit comments

Comments
 (0)