Fix tests

This commit is contained in:
Brian Anderson 2013-01-22 15:19:12 -08:00
parent 0300a2ff07
commit 6a4ccca377
12 changed files with 34 additions and 165 deletions

View file

@ -1,6 +1,8 @@
# Tests for these submodules will not be run by the default `make check` target.
SLOW_TESTS += \
mozjs \
pixman \
cairo \
$(NULL)
# 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

View file

@ -255,6 +255,9 @@ impl<T:Copy Owned,A> Scope<T,A> {
#[cfg(test)]
#[allow(non_implicitly_copyable_typarams)]
mod test {
use pipes::stream;
use super::Scope;
type animal = {name: ~str, species: species};
enum species {
chicken(~chicken),
@ -275,16 +278,16 @@ mod test {
}
fn mutate(a: &animal) {
match a.species {
chicken(c) => c.eggs_per_day += 1u,
bull(c) => c.horns += 1u
match &a.species {
&chicken(ref c) => c.eggs_per_day += 1u,
&bull(ref c) => c.horns += 1u
}
}
fn read_characteristic(a: &animal) -> uint {
match a.species {
chicken(c) => c.eggs_per_day,
bull(c) => c.horns
match &a.species {
&chicken(ref c) => c.eggs_per_day,
&bull(ref c) => c.horns
}
}
@ -300,19 +303,21 @@ mod test {
let iter1 = 3u;
let iter2 = 22u;
let read_port = comm::Port();
let read_chan = comm::Chan(&read_port);
let read_port = oldcomm::Port();
let read_chan = oldcomm::Chan(&read_port);
// fire up a reader task
for uint::range(0u, iter1) |i| {
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| {
comm::send(read_chan, henrietta.read(read_characteristic));
comm::send(read_chan, ferdinand.read(read_characteristic));
comm::recv(wait_port);
oldcomm::send(read_chan, henrietta.read(read_characteristic));
oldcomm::send(read_chan, ferdinand.read(read_characteristic));
wait_port.recv();
}
}
});
let hrc = henrietta.read(read_characteristic);
assert hrc == (i * iter2);
@ -321,11 +326,11 @@ mod test {
assert frc == i * iter2;
for uint::range(0u, iter2) |_i| {
assert hrc == comm::recv(read_port);
assert hrc == oldcomm::recv(read_port);
s.write(&henrietta, mutate);
assert frc == comm::recv(read_port);
assert frc == oldcomm::recv(read_port);
s.write(&ferdinand, mutate);
comm::send(wait_chan, ());
wait_chan.send(());
}
s.reader_joined();
}

View file

@ -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();
}
}

View file

@ -1,6 +1,5 @@
pub use gfx::util::cache;
pub use gfx::util::time;
pub mod actor;
pub mod tree;
pub mod task;

View file

@ -156,6 +156,9 @@ pub fn get_parent<T:Copy,O:ReadMethods<T>>(ops: &O, node: &T) -> Option<T> {
#[cfg(test)]
mod test {
use super::*;
use core::managed::ptr_eq;
enum dummy = {
fields: Tree<@dummy>,
value: uint
@ -173,7 +176,7 @@ mod test {
fn with_tree_fields<R>(d: &@dummy, f: fn(&Tree<@dummy>) -> R) -> R {
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 {