%% at_end_of_stream(+Stream).
%
% True iff the stream Stream has ended
-at_end_of_stream(S_or_a) :-
- ( var(S_or_a) ->
+at_end_of_stream(S) :-
+ ( var(S) ->
throw(error(instantiation_error, at_end_of_stream/1))
- ; atom(S_or_a) ->
- stream_property(S, alias(S_or_a))
- ; S = S_or_a
+ ; true
),
stream_property(S, end_of_stream(E)),
( E = at -> true ; E = past ).
current_input(S),
stream_property(S, end_of_stream(E)),
!,
- ( E = at ; E = past ).
+ ( E = at -> true ; E = past ).
%% set_stream_position(+Stream, +Position).
%
mod test {
use super::*;
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]
#[cfg_attr(miri, ignore)]
let results = machine.run_query("current_input(S).").collect::<Vec<_>>();
assert_eq!(results.len(), 1);
- assert!(results[0].is_ok());
+ assert!(is_successful(&results[0]));
}
#[test]
assert_eq!(results.len(), 1);
assert!(
- results[0].is_ok(),
+ is_successful(&results[0]),
"Expected read to succeed, got {:?}",
results[0]
);
let results = machine.run_query("current_output(S).").collect::<Vec<_>>();
assert_eq!(results.len(), 1);
- assert!(results[0].is_ok());
+ assert!(is_successful(&results[0]));
}
#[test]
assert_eq!(results.len(), 1);
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 {:?}",
results[0]
);
assert_eq!(results.len(), 1);
assert!(
- results[0].is_ok(),
+ is_successful(&results[0]),
"Expected write to succeed, got {:?}",
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]
+ );
+ }
}