mirror of
https://github.com/servo/servo.git
synced 2025-08-06 14:10:11 +01:00
Fix tests
This commit is contained in:
parent
0300a2ff07
commit
6a4ccca377
12 changed files with 34 additions and 165 deletions
|
@ -1,6 +1,8 @@
|
||||||
# Tests for these submodules will not be run by the default `make check` target.
|
# Tests for these submodules will not be run by the default `make check` target.
|
||||||
SLOW_TESTS += \
|
SLOW_TESTS += \
|
||||||
mozjs \
|
mozjs \
|
||||||
|
pixman \
|
||||||
|
cairo \
|
||||||
$(NULL)
|
$(NULL)
|
||||||
|
|
||||||
# These submodules will not be cleaned by the `make clean-fast` target.
|
# These submodules will not be cleaned by the `make clean-fast` target.
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
Subproject commit f37301008a770033211c48512d19db954918a4b9
|
Subproject commit 16b5d87d37b2ce377b919de20c6a45fdf9e052dc
|
|
@ -1 +1 @@
|
||||||
Subproject commit f0da2d3a9c67d0a4748779c67576cb763558e047
|
Subproject commit aff506ba29bd34e8980ad7c3286a7cdc4e8207ae
|
|
@ -1 +1 @@
|
||||||
Subproject commit c14e24d51502ffaa44ccde9877920ba829be1bd0
|
Subproject commit b33e9dbc11895d4e30ac4abde60e2d24a182930e
|
|
@ -1 +1 @@
|
||||||
Subproject commit 09e2852951c635cf9cabc76a862740188869c915
|
Subproject commit 7d1872b89050332e957504a66ee38d73773efaf1
|
|
@ -1 +1 @@
|
||||||
Subproject commit b69b3b49ad993c79156298eb6c96bec58db77128
|
Subproject commit 61ec64cbb17f0f14a2306ab9ab04565b622ccf77
|
|
@ -1 +1 @@
|
||||||
Subproject commit b5a5d728f0c092ca1881a26446860bb717d27448
|
Subproject commit 96e92609d0f250ae3222b9ba99f2e00acc5ec0fb
|
|
@ -1 +1 @@
|
||||||
Subproject commit a03bfeb74adfa0aae7e459a249f62e6e553c823b
|
Subproject commit 8657c14771908eb8577dfbe0fff5e85e3f1990da
|
|
@ -255,6 +255,9 @@ impl<T:Copy Owned,A> Scope<T,A> {
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
#[allow(non_implicitly_copyable_typarams)]
|
#[allow(non_implicitly_copyable_typarams)]
|
||||||
mod test {
|
mod test {
|
||||||
|
use pipes::stream;
|
||||||
|
use super::Scope;
|
||||||
|
|
||||||
type animal = {name: ~str, species: species};
|
type animal = {name: ~str, species: species};
|
||||||
enum species {
|
enum species {
|
||||||
chicken(~chicken),
|
chicken(~chicken),
|
||||||
|
@ -275,16 +278,16 @@ mod test {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn mutate(a: &animal) {
|
fn mutate(a: &animal) {
|
||||||
match a.species {
|
match &a.species {
|
||||||
chicken(c) => c.eggs_per_day += 1u,
|
&chicken(ref c) => c.eggs_per_day += 1u,
|
||||||
bull(c) => c.horns += 1u
|
&bull(ref c) => c.horns += 1u
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn read_characteristic(a: &animal) -> uint {
|
fn read_characteristic(a: &animal) -> uint {
|
||||||
match a.species {
|
match &a.species {
|
||||||
chicken(c) => c.eggs_per_day,
|
&chicken(ref c) => c.eggs_per_day,
|
||||||
bull(c) => c.horns
|
&bull(ref c) => c.horns
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -300,19 +303,21 @@ mod test {
|
||||||
|
|
||||||
let iter1 = 3u;
|
let iter1 = 3u;
|
||||||
let iter2 = 22u;
|
let iter2 = 22u;
|
||||||
let read_port = comm::Port();
|
let read_port = oldcomm::Port();
|
||||||
let read_chan = comm::Chan(&read_port);
|
let read_chan = oldcomm::Chan(&read_port);
|
||||||
|
|
||||||
// fire up a reader task
|
// fire up a reader task
|
||||||
for uint::range(0u, iter1) |i| {
|
for uint::range(0u, iter1) |i| {
|
||||||
s.reader_forked();
|
s.reader_forked();
|
||||||
let wait_chan = task::spawn_listener(|wait_port| {
|
let (wait_port, wait_chan) = stream();
|
||||||
|
|
||||||
|
do task::spawn {
|
||||||
for uint::range(0u, iter2) |_i| {
|
for uint::range(0u, iter2) |_i| {
|
||||||
comm::send(read_chan, henrietta.read(read_characteristic));
|
oldcomm::send(read_chan, henrietta.read(read_characteristic));
|
||||||
comm::send(read_chan, ferdinand.read(read_characteristic));
|
oldcomm::send(read_chan, ferdinand.read(read_characteristic));
|
||||||
comm::recv(wait_port);
|
wait_port.recv();
|
||||||
}
|
}
|
||||||
});
|
}
|
||||||
|
|
||||||
let hrc = henrietta.read(read_characteristic);
|
let hrc = henrietta.read(read_characteristic);
|
||||||
assert hrc == (i * iter2);
|
assert hrc == (i * iter2);
|
||||||
|
@ -321,11 +326,11 @@ mod test {
|
||||||
assert frc == i * iter2;
|
assert frc == i * iter2;
|
||||||
|
|
||||||
for uint::range(0u, iter2) |_i| {
|
for uint::range(0u, iter2) |_i| {
|
||||||
assert hrc == comm::recv(read_port);
|
assert hrc == oldcomm::recv(read_port);
|
||||||
s.write(&henrietta, mutate);
|
s.write(&henrietta, mutate);
|
||||||
assert frc == comm::recv(read_port);
|
assert frc == oldcomm::recv(read_port);
|
||||||
s.write(&ferdinand, mutate);
|
s.write(&ferdinand, mutate);
|
||||||
comm::send(wait_chan, ());
|
wait_chan.send(());
|
||||||
}
|
}
|
||||||
s.reader_joined();
|
s.reader_joined();
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,140 +0,0 @@
|
||||||
/*!
|
|
||||||
An actor type
|
|
||||||
*/
|
|
||||||
|
|
||||||
use pipes::{Port, Chan, SharedChan, stream};
|
|
||||||
use core::task;
|
|
||||||
|
|
||||||
/**
|
|
||||||
The client reference to an actor
|
|
||||||
|
|
||||||
Actors are only referred to by opaque handles parameterized
|
|
||||||
over the actor's message type, which can be considered the
|
|
||||||
actor's interface.
|
|
||||||
*/
|
|
||||||
struct ActorRef<M: Owned> {
|
|
||||||
chan: Chan<M>,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<M: Owned> ActorRef<M> {
|
|
||||||
fn send(&self, msg: M) {
|
|
||||||
self.chan.send(move msg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// The local actor interface
|
|
||||||
trait Actor<M> {
|
|
||||||
fn handle(&self, msg: M) -> bool;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// A helper function used by actor constructors
|
|
||||||
fn spawn<A: Actor<M>, M: Owned>(f: ~fn() -> A) -> ActorRef<M> {
|
|
||||||
let (port, chan) = stream();
|
|
||||||
do task::spawn |move f, move port| {
|
|
||||||
let actor = f();
|
|
||||||
loop {
|
|
||||||
let msg = port.recv();
|
|
||||||
if !actor.handle(move msg) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return ActorRef {
|
|
||||||
chan: move chan
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
struct SharedActorRef<M: Owned> {
|
|
||||||
chan: SharedChan<M>
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<M: Owned> SharedActorRef<M> {
|
|
||||||
fn send(&self, msg: M) {
|
|
||||||
self.chan.send(move msg);
|
|
||||||
}
|
|
||||||
|
|
||||||
fn clone(&self) -> SharedActorRef<M> {
|
|
||||||
SharedActorRef {
|
|
||||||
chan: self.chan.clone()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn SharedActorRef<M: Owned>(actor: ActorRef<M>) -> SharedActorRef<M> {
|
|
||||||
let chan = match move actor {
|
|
||||||
ActorRef {
|
|
||||||
chan: move chan
|
|
||||||
} => {
|
|
||||||
move chan
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
SharedActorRef {
|
|
||||||
chan: SharedChan(move chan)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(test)]
|
|
||||||
mod test {
|
|
||||||
|
|
||||||
enum HelloMsg {
|
|
||||||
GetName(Chan<~str>),
|
|
||||||
Exit(Chan<()>)
|
|
||||||
}
|
|
||||||
|
|
||||||
struct HelloActor {
|
|
||||||
name: ~str
|
|
||||||
}
|
|
||||||
|
|
||||||
impl HelloActor: Actor<HelloMsg> {
|
|
||||||
fn handle(&self, msg: HelloMsg) -> bool {
|
|
||||||
match msg {
|
|
||||||
GetName(chan) => chan.send(copy self.name),
|
|
||||||
Exit(chan) => {
|
|
||||||
chan.send(());
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn HelloActor(name: ~str) -> ActorRef<HelloMsg> {
|
|
||||||
do spawn |move name| {
|
|
||||||
HelloActor {
|
|
||||||
name: copy name
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn test_exit() {
|
|
||||||
let actor = HelloActor(~"bob");
|
|
||||||
let (port, chan) = stream();
|
|
||||||
actor.send(Exit(move chan));
|
|
||||||
port.recv();
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn test_shared() {
|
|
||||||
let actor = HelloActor(~"bob");
|
|
||||||
let actor1 = SharedActorRef(move actor);
|
|
||||||
let actor2 = actor1.clone();
|
|
||||||
|
|
||||||
let (port1, chan1) = stream();
|
|
||||||
actor1.send(GetName(move chan1));
|
|
||||||
let (port2, chan2) = stream();
|
|
||||||
actor2.send(GetName(move chan2));
|
|
||||||
|
|
||||||
assert port1.recv() == ~"bob";
|
|
||||||
assert port2.recv() == ~"bob";
|
|
||||||
|
|
||||||
let (port, chan) = stream();
|
|
||||||
actor1.send(Exit(move chan));
|
|
||||||
port.recv();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,6 +1,5 @@
|
||||||
pub use gfx::util::cache;
|
pub use gfx::util::cache;
|
||||||
pub use gfx::util::time;
|
pub use gfx::util::time;
|
||||||
|
|
||||||
pub mod actor;
|
|
||||||
pub mod tree;
|
pub mod tree;
|
||||||
pub mod task;
|
pub mod task;
|
|
@ -156,6 +156,9 @@ pub fn get_parent<T:Copy,O:ReadMethods<T>>(ops: &O, node: &T) -> Option<T> {
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod test {
|
mod test {
|
||||||
|
use super::*;
|
||||||
|
use core::managed::ptr_eq;
|
||||||
|
|
||||||
enum dummy = {
|
enum dummy = {
|
||||||
fields: Tree<@dummy>,
|
fields: Tree<@dummy>,
|
||||||
value: uint
|
value: uint
|
||||||
|
@ -173,7 +176,7 @@ mod test {
|
||||||
fn with_tree_fields<R>(d: &@dummy, f: fn(&Tree<@dummy>) -> R) -> R {
|
fn with_tree_fields<R>(d: &@dummy, f: fn(&Tree<@dummy>) -> R) -> R {
|
||||||
f(&d.fields)
|
f(&d.fields)
|
||||||
}
|
}
|
||||||
pure fn eq(a: &@dummy, b: &@dummy) -> bool { core::box::ptr_eq(*a, *b) }
|
pure fn tree_eq(a: &@dummy, b: &@dummy) -> bool { ptr_eq(*a, *b) }
|
||||||
}
|
}
|
||||||
|
|
||||||
fn new_dummy(v: uint) -> @dummy {
|
fn new_dummy(v: uint) -> @dummy {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue