Remove redundant alias resolution in at_end_of_stream/1, add corresponding tests for null streams
Also fixed at_end_of_stream/0 leaving a choicepoint.
This commit is contained in:
@@ -2188,12 +2188,10 @@ stream_property(S, P) :-
|
|||||||
%% at_end_of_stream(+Stream).
|
%% at_end_of_stream(+Stream).
|
||||||
%
|
%
|
||||||
% True iff the stream Stream has ended
|
% True iff the stream Stream has ended
|
||||||
at_end_of_stream(S_or_a) :-
|
at_end_of_stream(S) :-
|
||||||
( var(S_or_a) ->
|
( var(S) ->
|
||||||
throw(error(instantiation_error, at_end_of_stream/1))
|
throw(error(instantiation_error, at_end_of_stream/1))
|
||||||
; atom(S_or_a) ->
|
; true
|
||||||
stream_property(S, alias(S_or_a))
|
|
||||||
; S = S_or_a
|
|
||||||
),
|
),
|
||||||
stream_property(S, end_of_stream(E)),
|
stream_property(S, end_of_stream(E)),
|
||||||
( E = at -> true ; E = past ).
|
( E = at -> true ; E = past ).
|
||||||
@@ -2205,7 +2203,7 @@ at_end_of_stream :-
|
|||||||
current_input(S),
|
current_input(S),
|
||||||
stream_property(S, end_of_stream(E)),
|
stream_property(S, end_of_stream(E)),
|
||||||
!,
|
!,
|
||||||
( E = at ; E = past ).
|
( E = at -> true ; E = past ).
|
||||||
|
|
||||||
%% set_stream_position(+Stream, +Position).
|
%% set_stream_position(+Stream, +Position).
|
||||||
%
|
%
|
||||||
|
|||||||
@@ -510,9 +510,12 @@ impl Machine {
|
|||||||
|
|
||||||
self.indices.streams.insert(self.user_error);
|
self.indices.streams.insert(self.user_error);
|
||||||
|
|
||||||
|
let mut null_options = StreamOptions::default();
|
||||||
|
null_options.set_alias_to_atom_opt(Some(atom!("null_stream")));
|
||||||
|
|
||||||
self.indices
|
self.indices
|
||||||
.stream_aliases
|
.stream_aliases
|
||||||
.insert(atom!("null_stream"), Stream::Null(StreamOptions::default()));
|
.insert(atom!("null_stream"), Stream::Null(null_options));
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
|
|||||||
@@ -1908,6 +1908,14 @@ impl MachineState {
|
|||||||
mod test {
|
mod test {
|
||||||
use super::*;
|
use super::*;
|
||||||
use crate::machine::config::*;
|
use crate::machine::config::*;
|
||||||
|
use crate::LeafAnswer;
|
||||||
|
|
||||||
|
fn is_successful<T>(answer: &Result<LeafAnswer, T>) -> bool {
|
||||||
|
matches!(
|
||||||
|
answer,
|
||||||
|
Ok(LeafAnswer::True) | Ok(LeafAnswer::LeafAnswer { .. })
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
#[cfg_attr(miri, ignore)]
|
#[cfg_attr(miri, ignore)]
|
||||||
@@ -1919,7 +1927,7 @@ mod test {
|
|||||||
let results = machine.run_query("current_input(S).").collect::<Vec<_>>();
|
let results = machine.run_query("current_input(S).").collect::<Vec<_>>();
|
||||||
|
|
||||||
assert_eq!(results.len(), 1);
|
assert_eq!(results.len(), 1);
|
||||||
assert!(results[0].is_ok());
|
assert!(is_successful(&results[0]));
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
@@ -1933,7 +1941,7 @@ mod test {
|
|||||||
|
|
||||||
assert_eq!(results.len(), 1);
|
assert_eq!(results.len(), 1);
|
||||||
assert!(
|
assert!(
|
||||||
results[0].is_ok(),
|
is_successful(&results[0]),
|
||||||
"Expected read to succeed, got {:?}",
|
"Expected read to succeed, got {:?}",
|
||||||
results[0]
|
results[0]
|
||||||
);
|
);
|
||||||
@@ -1951,7 +1959,7 @@ mod test {
|
|||||||
let results = machine.run_query("current_output(S).").collect::<Vec<_>>();
|
let results = machine.run_query("current_output(S).").collect::<Vec<_>>();
|
||||||
|
|
||||||
assert_eq!(results.len(), 1);
|
assert_eq!(results.len(), 1);
|
||||||
assert!(results[0].is_ok());
|
assert!(is_successful(&results[0]));
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
@@ -1967,7 +1975,28 @@ mod test {
|
|||||||
|
|
||||||
assert_eq!(results.len(), 1);
|
assert_eq!(results.len(), 1);
|
||||||
assert!(
|
assert!(
|
||||||
results[0].is_ok(),
|
is_successful(&results[0]),
|
||||||
|
"Expected write to succeed, got {:?}",
|
||||||
|
results[0]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
#[cfg_attr(miri, ignore)]
|
||||||
|
fn put_code_null_stream() {
|
||||||
|
// TODO: switch to a proper solution for configuring the machine with null streams
|
||||||
|
// once `StreamConfig` supports it.
|
||||||
|
let mut machine = MachineBuilder::new().build();
|
||||||
|
machine.user_output = Stream::Null(StreamOptions::default());
|
||||||
|
machine.configure_streams();
|
||||||
|
|
||||||
|
let results = machine
|
||||||
|
.run_query("put_code(user_output, 65).")
|
||||||
|
.collect::<Vec<_>>();
|
||||||
|
|
||||||
|
assert_eq!(results.len(), 1);
|
||||||
|
assert!(
|
||||||
|
is_successful(&results[0]),
|
||||||
"Expected write to succeed, got {:?}",
|
"Expected write to succeed, got {:?}",
|
||||||
results[0]
|
results[0]
|
||||||
);
|
);
|
||||||
@@ -1987,9 +2016,45 @@ mod test {
|
|||||||
|
|
||||||
assert_eq!(results.len(), 1);
|
assert_eq!(results.len(), 1);
|
||||||
assert!(
|
assert!(
|
||||||
results[0].is_ok(),
|
is_successful(&results[0]),
|
||||||
"Expected write to succeed, got {:?}",
|
"Expected write to succeed, got {:?}",
|
||||||
results[0]
|
results[0]
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
#[cfg_attr(miri, ignore)]
|
||||||
|
fn at_end_of_stream_0_null_stream() {
|
||||||
|
let mut machine = MachineBuilder::new()
|
||||||
|
.with_streams(StreamConfig::in_memory())
|
||||||
|
.build();
|
||||||
|
|
||||||
|
let results = machine.run_query("at_end_of_stream.").collect::<Vec<_>>();
|
||||||
|
|
||||||
|
assert_eq!(results.len(), 1);
|
||||||
|
assert!(
|
||||||
|
is_successful(&results[0]),
|
||||||
|
"Expected at_end_of_stream to succeed, got {:?}",
|
||||||
|
results[0]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
#[cfg_attr(miri, ignore)]
|
||||||
|
fn at_end_of_stream_1_null_stream() {
|
||||||
|
let mut machine = MachineBuilder::new()
|
||||||
|
.with_streams(StreamConfig::in_memory())
|
||||||
|
.build();
|
||||||
|
|
||||||
|
let results = machine
|
||||||
|
.run_query("current_input(Stream), at_end_of_stream(Stream).")
|
||||||
|
.collect::<Vec<_>>();
|
||||||
|
|
||||||
|
assert_eq!(results.len(), 1);
|
||||||
|
assert!(
|
||||||
|
is_successful(&results[0]),
|
||||||
|
"Expected at_end_of_stream to succeed, got {:?}",
|
||||||
|
results[0]
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user