Meta.is_a consistent with case-type-of check (#5853)

Removing special handling of `AtomConstructor` in `Meta.is_a` check.

# Important Notes
A lot of tests are about to fail. Many of them indirectly call `Meta.is_a` with a constructor rather than type.
This commit is contained in:
Jaroslav Tulach 2023-03-10 08:41:04 +01:00 committed by GitHub
parent 65976a4b0c
commit 8bbdd1af5b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
92 changed files with 851 additions and 630 deletions

View File

@ -305,7 +305,7 @@ type Any
example_catch =
error = Error.throw (Illegal_Argument.Error "My message")
error.catch Illegal_Argument.Error (err -> err.message)
error.catch Illegal_Argument (err -> err.message)
> Example
Catching any dataflow error and turning it into a regular value.

View File

@ -165,7 +165,7 @@ take_helper length at single_slice slice_ranges index_sub_range = case index_sub
end = 0.up_to length . find i-> (predicate (at i)).not
true_end = if end.is_nothing then length else end
single_slice 0 true_end
Index_Sub_Range.By_Index one_or_many_descriptors -> Panic.recover [Index_Out_Of_Bounds.Error, Illegal_Argument.Error] <|
Index_Sub_Range.By_Index one_or_many_descriptors -> Panic.recover [Index_Out_Of_Bounds, Illegal_Argument] <|
indices = case one_or_many_descriptors of
_ : Vector -> one_or_many_descriptors
_ -> [one_or_many_descriptors]
@ -215,7 +215,7 @@ drop_helper length at single_slice slice_ranges index_sub_range = case index_sub
end = 0.up_to length . find i-> (predicate (at i)).not
true_end = if end.is_nothing then length else end
single_slice true_end length
Index_Sub_Range.By_Index one_or_many_descriptors -> Panic.recover [Index_Out_Of_Bounds.Error, Illegal_Argument.Error] <|
Index_Sub_Range.By_Index one_or_many_descriptors -> Panic.recover [Index_Out_Of_Bounds, Illegal_Argument] <|
indices = case one_or_many_descriptors of
_ : Vector -> one_or_many_descriptors
_ -> [one_or_many_descriptors]

View File

@ -193,7 +193,7 @@ type JS_Object_Comparator
obj1_keys = obj1.field_names
obj2_keys = obj2.field_names
obj1_keys.length == obj2_keys.length && obj1_keys.all key->
(obj1.get key == obj2.at key).catch No_Such_Key.Error _->False
(obj1.get key == obj2.at key).catch No_Such_Key _->False
hash : JS_Object -> Integer
hash obj =

View File

@ -4,7 +4,6 @@ import project.Data.Ordering.Ordering
import project.Data.Ordering.Comparable
import project.Data.Text.Case_Sensitivity.Case_Sensitivity
import project.Data.Text.Text_Ordering.Text_Ordering
import project.Error.Common.Incomparable_Values
import project.Nothing.Nothing
from project.Data.Boolean import True, False

View File

@ -39,7 +39,7 @@ type Model
ln_series xs series_name="Values" =
ln_with_panic x = if x.is_nothing then Nothing else
if x <= 0 then Panic.throw (Illegal_Argument.Error (series_name + " must be positive.")) else x.ln
Panic.recover Illegal_Argument.Error <| xs.map ln_with_panic
Panic.recover Illegal_Argument <| xs.map ln_with_panic
## Use Least Squares to fit a line to the data.
fit_least_squares : Vector -> Vector -> Model -> Fitted_Model ! Illegal_Argument | Fit_Error

View File

@ -172,8 +172,8 @@ type Statistic
if skip_moments.not && result.is_nothing then report_error statistics else
statistics.map statistic-> case statistic of
Statistic.Count -> counter.count
Statistic.Minimum -> if counter.comparatorError then (Error.throw Incomparable_Values.Error) else counter.minimum
Statistic.Maximum -> if counter.comparatorError then (Error.throw Incomparable_Values.Error) else counter.maximum
Statistic.Minimum -> if counter.comparatorError then (Error.throw (Incomparable_Values.Error Nothing Nothing)) else counter.minimum
Statistic.Maximum -> if counter.comparatorError then (Error.throw (Incomparable_Values.Error Nothing Nothing)) else counter.maximum
Statistic.Covariance series -> calculate_correlation_statistics data series . covariance
Statistic.Pearson series -> calculate_correlation_statistics data series . pearsonCorrelation
Statistic.Spearman series -> calculate_spearman_rank data series
@ -220,8 +220,8 @@ type Statistic
row = Panic.throw_wrapped_if_error <| statistics.map s-> case s of
Statistic.Count -> counter.count
Statistic.Minimum -> if counter.comparatorError then (Error.throw Incomparable_Values.Error) else counter.minimum
Statistic.Maximum -> if counter.comparatorError then (Error.throw Incomparable_Values.Error) else counter.maximum
Statistic.Minimum -> if counter.comparatorError then (Error.throw (Incomparable_Values.Error Nothing Nothing)) else counter.minimum
Statistic.Maximum -> if counter.comparatorError then (Error.throw (Incomparable_Values.Error Nothing Nothing)) else counter.maximum
_ -> if result.is_nothing then Error.throw (Illegal_Argument.Error ("Can only compute " + s.to_text + " on numerical data sets.")) else result.compute (to_moment_statistic s)
output.append row
@ -289,7 +289,7 @@ to_moment_statistic s = case s of
wrap_java_call : Any -> Any
wrap_java_call ~function =
report_unsupported _ = Error.throw (Illegal_Argument.Error ("Can only compute correlations on numerical data sets."))
handle_unsupported = Panic.catch Unsupported_Argument_Types.Error handler=report_unsupported
handle_unsupported = Panic.catch Unsupported_Argument_Types handler=report_unsupported
handle_unsupported <| Illegal_Argument.handle_java_exception <| function

View File

@ -83,7 +83,7 @@ make_match_matrix matcher objects criteria object_name_mapper=(x->x) criterion_m
Match_Matrix.Value matrix criteria objects
## PRIVATE
internal_match_criteria_implementation matcher objects criteria reorder=False name_mapper=(x->x) = Panic.catch Wrapped_Dataflow_Error.Error (handler = x-> x.payload.unwrap) <|
internal_match_criteria_implementation matcher objects criteria reorder=False name_mapper=(x->x) = Panic.catch Wrapped_Dataflow_Error (handler = x-> x.payload.unwrap) <|
## TODO [RW] discuss: this line of code also shows an issue we had with ensuring input dataflow-errors are correctly propagated, later on we stopped doing that and testing for that as it was too cumbersome. Maybe it could be helped with an @Accepts_Error annotation similar to the one from the interpreter???
[matcher, objects, criteria, reorder, name_mapper] . each v->
Panic.rethrow (v.map_error Wrapped_Dataflow_Error.Error)

View File

@ -155,7 +155,7 @@ find_sub_range_end text predicate =
loop 0 0 iterator.next
## PRIVATE
resolve_index_or_range text descriptor = Panic.recover [Index_Out_Of_Bounds.Error, Illegal_Argument.Error] <|
resolve_index_or_range text descriptor = Panic.recover [Index_Out_Of_Bounds, Illegal_Argument] <|
iterator = BreakIterator.getCharacterInstance
iterator.setText text
case descriptor of
@ -203,7 +203,7 @@ character_ranges text =
ranges.to_vector
## PRIVATE
batch_resolve_indices_or_ranges text descriptors = Panic.recover [Index_Out_Of_Bounds.Error, Illegal_Argument.Error] <|
batch_resolve_indices_or_ranges text descriptors = Panic.recover [Index_Out_Of_Bounds, Illegal_Argument] <|
## This is pre-computing the ranges for all characters in the string, which
may be much more than necessary, for example if all ranges reference only
the beginning of the string. In the future we may want to replace this

View File

@ -5,7 +5,6 @@ import project.Data.Time.Duration.Duration
import project.Data.Ordering.Comparable
import project.Data.Ordering.Incomparable
import project.Data.Text.Text
import project.Error.Common.Incomparable_Values
import project.Error.Error
import project.Error.Illegal_Argument.Illegal_Argument
import project.Error.Time_Error.Time_Error

View File

@ -79,7 +79,7 @@ type Error
example_catch =
error = Error.throw (Illegal_Argument.Error "My message")
error.catch Illegal_Argument.Error (err -> err.message)
error.catch Illegal_Argument (err -> err.message)
> Example
Catching any dataflow error and turning it into a regular value.

View File

@ -150,7 +150,7 @@ type Incomparable_Values
Arguments:
- left: The left value (first operand)
- right: The right value (second operand)
Error left=Nothing right=Nothing
Error left right
## UNSTABLE
@ -165,10 +165,10 @@ type Incomparable_Values
Catches possible errors from comparing values and throws an
`Incomparable_Values` if any occur.
handle_errors ~function =
handle t = Panic.catch t handler=(_-> Error.throw Incomparable_Values.Error)
handle t = Panic.catch t handler=(_-> Error.throw (Incomparable_Values.Error Nothing Nothing))
handle_cmp_exc = Panic.catch CompareException handler=(exc-> Error.throw (Incomparable_Values.Error exc.getLeftOperand exc.getRightOperand))
handle ClassCastException <| handle No_Such_Method.Error <| handle Type_Error.Error <| handle Unsupported_Argument_Types.Error <| handle_cmp_exc <|
handle ClassCastException <| handle No_Such_Method <| handle Type_Error <| handle Unsupported_Argument_Types <| handle_cmp_exc <|
function
@Builtin_Type

View File

@ -104,7 +104,7 @@ type Panic
> Example
Handling a specific type of panic.
Panic.catch Illegal_Argument.Error (Panic.throw (Illegal_Argument.Error "Oh no!" Nothing)) error->
Panic.catch Illegal_Argument (Panic.throw (Illegal_Argument.Error "Oh no!" Nothing)) error->
"Caught an `Illegal_Argument`: "+error.payload.message
> Example
@ -142,12 +142,12 @@ type Panic
> Example
Converting an expected panic to a dataflow error.
Panic.recover Illegal_Argument.Error (Panic.throw (Illegal_Argument.Error "Oh!" Nothing))
Panic.recover Illegal_Argument (Panic.throw (Illegal_Argument.Error "Oh!" Nothing))
> Example
Converting one of many expected panic types to a dataflow error.
Panic.recover [Illegal_Argument.Error, Illegal_State.Error] (Panic.throw (Illegal_Argument.Error "Oh!" Nothing))
Panic.recover [Illegal_Argument, Illegal_State] (Panic.throw (Illegal_Argument.Error "Oh!" Nothing))
recover : (Vector Any | Any) -> Any -> Any
recover expected_types ~action =
types_to_check = case expected_types of
@ -174,7 +174,7 @@ type Panic
- action: The code to execute that potentially raised a Wrapped_Dataflow_Error.
handle_wrapped_dataflow_error : Any -> Any
handle_wrapped_dataflow_error ~action =
Panic.catch Wrapped_Dataflow_Error.Error action caught_panic->
Panic.catch Wrapped_Dataflow_Error action caught_panic->
Error.throw caught_panic.payload.payload
@Builtin_Type

View File

@ -544,10 +544,11 @@ type File
The `with_input_stream` method should be preferred whenever possible.
new_input_stream : Vector File_Access -> Input_Stream ! File_Error
new_input_stream self open_options =
opts = open_options . map (_.to_java) . to_array
stream = File_Error.handle_java_exceptions self (self.input_stream opts)
resource = Managed_Resource.register stream close_stream
Input_Stream.Value self resource
if self.is_directory then Error.throw (File_Error.IO_Error self "File '"+self.path+"' is a directory") else
opts = open_options . map (_.to_java) . to_array
stream = File_Error.handle_java_exceptions self (self.input_stream opts)
resource = Managed_Resource.register stream close_stream
Input_Stream.Value self resource
## ADVANCED

View File

@ -50,13 +50,13 @@ type Existing_File_Behavior
Existing_File_Behavior.Overwrite -> file.with_output_stream [File_Access.Write, File_Access.Create, File_Access.Truncate_Existing] action
Existing_File_Behavior.Append -> file.with_output_stream [File_Access.Write, File_Access.Create, File_Access.Append] action
Existing_File_Behavior.Error -> file.with_output_stream [File_Access.Write, File_Access.Create_New] action
Existing_File_Behavior.Backup -> Panic.recover [File_Error.IO_Error, File_Error.Not_Found] <|
Existing_File_Behavior.Backup -> recover_io_and_not_found <|
handle_existing_file _ =
write_file_backing_up_old_one file action
handle_write_failure_dataflow caught_panic =
Error.throw caught_panic.payload.cause
handle_file_already_exists = Panic.catch File_Error.Already_Exists handler=handle_existing_file
handle_internal_dataflow = Panic.catch Internal_Write_Operation_Errored.Error handler=handle_write_failure_dataflow
handle_file_already_exists = catch_already_exists handle_existing_file
handle_internal_dataflow = Panic.catch Internal_Write_Operation_Errored handler=handle_write_failure_dataflow
## We first attempt to write the file to the original
destination, but if that files due to the file already
existing, we will run the alternative algorithm which uses a
@ -68,7 +68,7 @@ type Existing_File_Behavior
## PRIVATE
write_file_backing_up_old_one : File -> (Output_Stream -> Nothing) -> Nothing ! File_Error
write_file_backing_up_old_one file action = Panic.recover [File_Error.IO_Error, File_Error.Not_Found] <|
write_file_backing_up_old_one file action = recover_io_and_not_found <|
parent = file.parent
bak_file = parent / file.name+".bak"
go i =
@ -85,9 +85,9 @@ write_file_backing_up_old_one file action = Panic.recover [File_Error.IO_Error,
the file must have been created, but since we failed, we need to clean it up.
new_file.delete
Error.throw caught_panic.payload.cause
handle_file_already_exists = Panic.catch File_Error.Already_Exists handler=handle_existing_file
handle_internal_dataflow = Panic.catch Internal_Write_Operation_Errored.Error handler=handle_write_failure_dataflow
handle_internal_panic = Panic.catch Internal_Write_Operation_Panicked.Panic handler=handle_write_failure_panic
handle_file_already_exists = catch_already_exists handle_existing_file
handle_internal_dataflow = Panic.catch Internal_Write_Operation_Errored handler=handle_write_failure_dataflow
handle_internal_panic = Panic.catch Internal_Write_Operation_Panicked handler=handle_write_failure_panic
handle_file_already_exists <| handle_internal_dataflow <| handle_internal_panic <|
Panic.rethrow <|
new_file.with_output_stream [File_Access.Write, File_Access.Create_New] output_stream->
@ -101,7 +101,10 @@ write_file_backing_up_old_one file action = Panic.recover [File_Error.IO_Error,
writing the new one to the temporary location. There is nothing
to back-up anymore, but this is not a failure, so it can be
safely ignored.
Panic.catch File_Error.Not_Found handler=(_->Nothing) <|
not_found_handler caught_panic = case caught_panic.payload of
File_Error.Not_Found _ -> Nothing
_ -> Panic.throw caught_panic
Panic.catch File_Error handler=not_found_handler <|
Panic.rethrow <| file.move_to bak_file replace_existing=True
Panic.rethrow <| new_file.move_to file
## Here we manually check if the target file is writable. This is necessary,
@ -124,3 +127,18 @@ type Internal_Write_Operation_Panicked
type Internal_Write_Operation_Errored
## PRIVATE
Error (cause : Any)
## PRIVATE
catch_already_exists handler =
panic_handler caught_panic = case caught_panic.payload of
File_Error.Already_Exists _ -> handler caught_panic
_ -> Panic.throw caught_panic
Panic.catch File_Error handler=panic_handler
## PRIVATE
recover_io_and_not_found =
panic_handler caught_panic = case caught_panic.payload of
File_Error.IO_Error _ _ -> caught_panic.convert_to_dataflow_error
File_Error.Not_Found _ -> caught_panic.convert_to_dataflow_error
_ -> Panic.throw caught_panic
Panic.catch File_Error handler=panic_handler

View File

@ -79,7 +79,7 @@ Text.write self path encoding=Encoding.utf_8 on_existing_file=Existing_File_Beha
[36, -62, -93, -62, -89, -30, -126, -84, -62, -94].write_bytes Examples.scratch_file.write_bytes Examples.scratch_file Existing_File_Behavior.Append
Vector.write_bytes : (File|Text) -> Existing_File_Behavior -> File ! Illegal_Argument | File_Error
Vector.write_bytes self path on_existing_file=Existing_File_Behavior.Backup =
Panic.catch Unsupported_Argument_Types.Error handler=(_ -> Error.throw (Illegal_Argument.Error "Only Vectors consisting of bytes (integers in the range from -128 to 127) are supported by the `write_bytes` method.")) <|
Panic.catch Unsupported_Argument_Types handler=(_ -> Error.throw (Illegal_Argument.Error "Only Vectors consisting of bytes (integers in the range from -128 to 127) are supported by the `write_bytes` method.")) <|
## Convert to a byte array before writing - and fail early if there is any problem.
byte_array = Array_Builder.ensureByteArray self.to_array

View File

@ -217,7 +217,7 @@ type Connection
- batch_size: Specifies how many rows should be uploaded in a single
batch.
upload_table : Text -> Materialized_Table -> Boolean -> Integer -> Table
upload_table self name table temporary=True batch_size=1000 = Panic.recover Illegal_State.Error <|
upload_table self name table temporary=True batch_size=1000 = Panic.recover Illegal_State <|
create_sql = create_table_statement name table temporary
create_table = self.execute_update create_sql

View File

@ -98,7 +98,7 @@ default_postgres_port =
hardcoded_port = 5432
case Environment.get "PGPORT" of
Nothing -> hardcoded_port
port -> Integer.parse port . catch Number_Parse_Error.Error (_->hardcoded_port)
port -> Integer.parse port . catch Number_Parse_Error (_->hardcoded_port)
## PRIVATE
default_postgres_database = Environment.get "PGDATABASE" "postgres"

View File

@ -1206,7 +1206,7 @@ type Table
new_name = p.first
Aggregate_Helper.make_aggregate_column self agg new_name . catch
partitioned = results.partition (_.is_a Internal_Column.Value)
partitioned = results.partition (_.is_a Internal_Column)
## When working on join we may encounter further issues with having
aggregate columns exposed directly, it may be useful to re-use

View File

@ -170,7 +170,7 @@ type Postgres_Connection
- batch_size: Specifies how many rows should be uploaded in a single
batch.
upload_table : Text -> Materialized_Table -> Boolean -> Integer -> Database_Table
upload_table self name table temporary=True batch_size=1000 = Panic.recover Illegal_State.Error <|
upload_table self name table temporary=True batch_size=1000 = Panic.recover Illegal_State <|
self.connection.upload_table name table temporary batch_size
## PRIVATE

View File

@ -163,7 +163,7 @@ type SQLite_Connection
- batch_size: Specifies how many rows should be uploaded in a single
batch.
upload_table : Text -> Materialized_Table -> Boolean -> Integer -> Database_Table
upload_table self name table temporary=True batch_size=1000 = Panic.recover Illegal_State.Error <|
upload_table self name table temporary=True batch_size=1000 = Panic.recover Illegal_State <|
self.connection.upload_table name table temporary batch_size
## PRIVATE

View File

@ -267,7 +267,7 @@ type Data_Formatter
## PRIVATE
make_auto_formatter self =
# TODO The panic rethrow+recover is a workaround for the vector error propagation bug.
formatters = Panic.recover Illegal_Argument.Error (self.get_specific_type_formatters.map Panic.rethrow)
formatters = Panic.recover Illegal_Argument (self.get_specific_type_formatters.map Panic.rethrow)
AnyObjectFormatter.new formatters.to_array
## PRIVATE

View File

@ -58,7 +58,7 @@ type Storage
Converts a Java storage id to a `Storage`.
from_java : Integer -> Storage
from_java id =
Storage.types.at id . catch Index_Out_Of_Bounds.Error _->
Storage.types.at id . catch Index_Out_Of_Bounds _->
Panic.throw (Illegal_State.Error "Unknown storage type: "+id.to_text)
## PRIVATE

View File

@ -1807,7 +1807,7 @@ type Table
if base_format == Nothing then Error.throw (File_Error.Unsupported_Output_Type file Table) else
self.write file format=base_format on_existing_file match_columns on_problems
_ ->
Panic.catch No_Such_Method.Error (format.write_table file self on_existing_file match_columns on_problems) caught_panic->
Panic.catch No_Such_Method (format.write_table file self on_existing_file match_columns on_problems) caught_panic->
# Ensure that we handle only the specific unresolved method and not swallow any other errors.
if caught_panic.payload.method_name != "write_table" then Panic.throw caught_panic else
Error.throw (File_Error.Unsupported_Output_Type format Table)

View File

@ -185,7 +185,9 @@ detect_metadata file format =
False -> trailing_line_separator
has_any_content = reader.getVisitedCharactersCount > 0
Detected_File_Metadata.Value headers effective_line_separator has_trailing_line_separator has_any_content
result.catch File_Error.Not_Found (_->(Detected_File_Metadata.Value Nothing Nothing False False))
result.catch File_Error error-> case error of
File_Error.Not_Found _ -> Detected_File_Metadata.Value Nothing Nothing False False
_ -> Error.throw error
## PRIVATE
Checks if the file has a newline at the end.

View File

@ -51,7 +51,7 @@ write_file table format file on_existing_file match_columns on_problems =
If the file does not exist or is empty, it acts like a regular overwrite.
append_to_file : Table -> Delimited_Format -> File -> Match_Columns -> Problem_Behavior -> Any
append_to_file table format file match_columns on_problems =
Column_Name_Mismatch.handle_java_exception <| Column_Count_Mismatch.handle_java_exception <| Panic.recover Illegal_Argument.Error <|
Column_Name_Mismatch.handle_java_exception <| Column_Count_Mismatch.handle_java_exception <| Panic.recover Illegal_Argument <|
inferring_format = format.with_line_endings Infer
metadata = Delimited_Reader.detect_metadata file inferring_format
preexisting_headers = metadata.headers
@ -135,7 +135,7 @@ write_to_stream table format stream on_problems related_file=Nothing separator_o
instead of the one from `format`.
write_to_writer : Table -> Delimited_Format -> Writer -> Text | Nothing -> Boolean -> Nothing
write_to_writer table format java_writer separator_override=Nothing needs_leading_newline=False =
column_formatters = Panic.recover Illegal_Argument.Error <| case format.value_formatter of
column_formatters = Panic.recover Illegal_Argument <| case format.value_formatter of
Nothing -> table.columns.map column-> case column.storage_type of
Storage.Text -> TextFormatter.new
_ ->

View File

@ -82,7 +82,7 @@ expect_column_or_value_as_text field_name column_or_value ~action = case column_
the backend). So we assume it is a column and if it doesn't quack like a
column, we fall back to a type error.
maybe_column ->
result = Panic.catch No_Such_Method.Error (Value_Type.expect_text maybe_column.value_type True) _->
result = Panic.catch No_Such_Method (Value_Type.expect_text maybe_column.value_type True) _->
Error.throw (Type_Error.Error Text (Meta.type_of maybe_column) field_name)
## We don't run the action above, to avoid catching spurious
`No_Such_Method` from the action itself. Instead we just return

View File

@ -27,10 +27,10 @@ type Join_Condition_Resolver
resolve_selector resolver selector =
r_1 = resolver selector
r_2 = r_1.catch No_Such_Column.Error _->
r_2 = r_1.catch No_Such_Column _->
problem_builder.report_missing_input_columns [selector]
Nothing
r_2.catch Index_Out_Of_Bounds.Error _->
r_2.catch Index_Out_Of_Bounds _->
problem_builder.report_oob_indices [selector]
Nothing
resolve_left = resolve_selector self.left_at

View File

@ -319,12 +319,19 @@ Error.should_be_false self = Test.fail_match_on_unexpected_error self 1
example_should_be_a = 1.should_be_a Boolean
Any.should_be_a : Any -> Test_Result
Any.should_be_a self typ = if self.is_a typ || self==typ then Test_Result.Success else
loc = Meta.get_source_location 0
expected_type = Meta.get_qualified_type_name typ
actual_type = Meta.get_qualified_type_name self
message = "Expected a value of type " + expected_type + " but got a value of type " + actual_type + " instead (at " + loc + ")."
Test.fail message
Any.should_be_a self typ =
ok = case Meta.meta typ of
c : Meta.Constructor -> case Meta.meta self of
a : Meta.Atom -> a.constructor == c
_ -> False
_ -> self.is_a typ || self==typ
if ok then Test_Result.Success else
loc = Meta.get_source_location 3
expected_type = Meta.get_qualified_type_name typ
actual_type = Meta.get_qualified_type_name self
message = "Expected a value of type " + expected_type + " but got a value of type " + actual_type + " instead (at " + loc + ")."
Test.fail message
## Asserts that a value is of a given type.
@ -418,7 +425,7 @@ Error.should_contain_the_same_elements_as self _ frames_to_skip=0 = Test.fail_ma
Any.should_contain : Any -> Integer -> Test_Result
Any.should_contain self element frames_to_skip=0 =
loc = Meta.get_source_location 1+frames_to_skip
contains_result = Panic.catch No_Such_Method.Error (self.contains element) caught_panic->
contains_result = Panic.catch No_Such_Method (self.contains element) caught_panic->
if caught_panic.payload.method_name != "contains" then Panic.throw caught_panic else
msg = "The value (" + self.to_text + ") does not support the method `contains` (at " + loc + ")."
Test.fail msg

View File

@ -25,7 +25,7 @@ test_problem_handling : (Problem_Behavior -> Any) -> Vector Any -> (Any -> Nothi
test_problem_handling action expected_problems result_checker =
error_checker error_result =
first_problem = expected_problems.first
first_problem_type = Meta.meta first_problem . constructor . value
first_problem_type = Meta.type_of first_problem
error_result . should_fail_with first_problem_type frames_to_skip=3
error_result.catch . should_equal first_problem frames_to_skip=3
warnings_checker warnings =

View File

@ -31,12 +31,6 @@ public abstract class IsValueOfTypeNode extends Node {
public abstract boolean execute(Object expectedType, Object payload);
@Specialization
boolean doAtom(AtomConstructor consr, Object payload) {
Object expectedType = consr.getType();
return execute(expectedType, payload);
}
@Specialization
boolean doPolyglotProxy(Object expectedType, PolyglotProxy proxy) {
Object tpeOfPayload = typeOfNode.execute(proxy);

View File

@ -1,18 +1,14 @@
package org.enso.interpreter.test;
import java.io.ByteArrayOutputStream;
import java.net.URI;
import java.nio.file.Paths;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.enso.polyglot.RuntimeOptions;
import org.graalvm.polyglot.Context;
import org.graalvm.polyglot.Engine;
import org.graalvm.polyglot.Language;
import org.graalvm.polyglot.Source;
import org.graalvm.polyglot.Value;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
@ -140,6 +136,38 @@ public class MetaIsATest extends TestBase {
}
}
@Test
public void constructorVariants() throws Exception {
var g = ValuesGenerator.create(ctx);
var found = new HashMap<Value, Value>();
final List<Value> values = g.constructorsAndValuesAndSumType();
for (var v1 : values) {
for (var v2 : values) {
assertTypeWithCheck(g, v1, v2, found);
}
}
assertEquals("Just one: " + found, 1, found.size());
}
private void assertTypeWithCheck(ValuesGenerator g, Value type, Value value, Map<Value, Value> found) {
var r = isACheck.execute(value, type);
Value withTypeCaseOf;
try {
withTypeCaseOf = g.withType(type);
} catch (IllegalArgumentException ex) {
assertFalse("It is not a type: " + type + " value: " + value, r.asBoolean());
return;
}
var is = withTypeCaseOf.execute(value);
assertTrue("Returns boolean for " + withTypeCaseOf, is.fitsInInt());
if (r.asBoolean()) {
assertEquals("True is 1 for " + type + " check of " + value, 1, is.asInt());
found.put(type, value);
} else {
assertEquals("False is 0 for " + type + " check of " + value, 0, is.asInt());
}
}
@Test
public void typesAreNotInstancesOfThemselves() throws Exception {
var g = ValuesGenerator.create(ctx);

View File

@ -1,19 +1,13 @@
package org.enso.interpreter.test;
import java.io.ByteArrayOutputStream;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.net.URI;
import java.nio.file.Paths;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Set;
import org.enso.interpreter.runtime.type.ConstantsGen;
import org.enso.polyglot.RuntimeOptions;
import org.graalvm.polyglot.Context;
import org.graalvm.polyglot.Engine;
import org.graalvm.polyglot.Language;
import org.graalvm.polyglot.Source;
import org.graalvm.polyglot.Value;
import static org.junit.Assert.assertEquals;

View File

@ -34,6 +34,7 @@ class ValuesGenerator {
private final Context ctx;
private final Set<Language> languages;
private final Map<String, ValueInfo> values = new HashMap<>();
private final Map<String, List<Value>> multiValues = new HashMap<>();
private ValuesGenerator(Context ctx, Set<Language> languages) {
this.ctx = ctx;
@ -49,10 +50,13 @@ class ValuesGenerator {
return new ValuesGenerator(ctx, set);
}
private ValueInfo v(String k, String t, String s) {
var v = values.get(k);
private ValueInfo v(String key, String prelude, String typeOrValue) {
if (key == null) {
key = typeOrValue;
}
var v = values.get(key);
if (v == null) {
var f = ctx.eval("enso", t + "\nn = " + s);
var f = ctx.eval("enso", prelude + "\nn = " + typeOrValue);
var value = f.invokeMember("eval_expression", "n");
var c = ctx.eval("enso", """
{import}
@ -61,13 +65,13 @@ class ValuesGenerator {
v : {type} -> 1
_ -> 0
""".replace("{type}", s).replace("{import}", t)
""".replace("{type}", typeOrValue).replace("{import}", prelude)
);
if (k != null) {
if (key != null) {
var check = c.invokeMember("eval_expression", "check");
assertTrue("Can execute the check", check.canExecute());
v = new ValueInfo(value, check);
values.put(k, v);
values.put(key, v);
} else {
v = new ValueInfo(value, null);
}
@ -83,21 +87,46 @@ class ValuesGenerator {
*
* @param typeDefs Type definitions.
* @param expressions List of expressions - every expression will be converted to a {@link Value}.
* @param checks list of names (with {@code null}) to define checks for
* @return List of values converted from the given expressions.
*/
private List<Value> createValuesOfCustomType(String typeDefs, List<String> expressions) {
private List<Value> createValuesOfCustomType(String typeDefs, List<String> expressions, List<String> checks) {
var prev = multiValues.get(typeDefs);
if (prev != null) {
return prev;
}
var sb = new StringBuilder();
sb.append(typeDefs);
sb.append("\n");
for (int i = 0; i < expressions.size(); i++) {
sb.append("var_").append(i).append(" = ").append(expressions.get(i)).append("\n");
}
for (int i = 0; i < expressions.size(); i++) {
var c = checks != null ? checks.get(i) : null;
if (c == null) {
continue;
}
sb.append("""
check_{i} x = case x of
v : {type} -> 1
_ -> 0
""".replace("{type}", c).replace("{i}", "" + i));
}
Value module = ctx.eval("enso", sb.toString());
List<Value> values = new ArrayList<>(expressions.size());
for (int i = 0; i < expressions.size(); i++) {
Value val = module.invokeMember(Module.EVAL_EXPRESSION, "var_" + i);
values.add(val);
var c = checks != null ? checks.get(i) : null;
if (c == null) {
continue;
}
Value check = module.invokeMember(Module.EVAL_EXPRESSION, "check_" + i);
this.values.put(c, new ValueInfo(val, check));
}
multiValues.put(typeDefs, values);
return values;
}
@ -390,7 +419,7 @@ class ValuesGenerator {
"Time_Zone.parse 'Europe/London'",
"Time_Zone.parse 'CET'"
)) {
collect.add(v(null, "import Standard.Base.Data.Time.Time_Zone.Time_Zone", expr).type());
collect.add(v("timeZones-" + expr, "import Standard.Base.Data.Time.Time_Zone.Time_Zone", expr).type());
}
}
if (languages.contains(Language.JAVA)) {
@ -533,7 +562,7 @@ class ValuesGenerator {
"Map.empty.insert 'A' 1 . insert 'B' 2 . insert 'C' 3",
"Map.empty.insert 'C' 3 . insert 'B' 2 . insert 'A' 1"
)) {
collect.add(v(null, imports, expr).type());
collect.add(v("maps-" + expr, imports, expr).type());
}
}
return collect;
@ -566,7 +595,7 @@ class ValuesGenerator {
"Node.C2 (Node.C2 (Node.C1 Node.Nil) (Node.C1 Node.Nil)) (Node.C2 (Node.C3 (Node.Nil) (Node.Value 22) (Node.Nil)) (Node.C2 (Node.Value 22) (Node.Nil)))",
"Node.C2 (Node.C2 (Node.C1 Node.Nil) (Node.C1 Node.Nil)) (Node.C2 (Node.C3 (Node.Nil) (Node.Nil) (Node.Value 22)) (Node.C2 (Node.Value 22) (Node.Nil)))"
);
collect.addAll(createValuesOfCustomType(nodeTypeDef, exprs));
collect.addAll(createValuesOfCustomType(nodeTypeDef, exprs, null));
}
return collect;
}
@ -581,7 +610,38 @@ class ValuesGenerator {
}
for (var v : collect) {
assertTrue("It is can be executed" + v, v.canExecute());
assertTrue("It can be executed " + v, v.canExecute());
}
return collect;
}
public Value typeSumType() {
return constructorsAndValuesAndSumType().get(0);
}
public List<Value> constructorsAndValuesAndSumType() {
var collect = new ArrayList<Value>();
if (languages.contains(Language.ENSO)) {
var code = """
type Sum_Type
Variant_A x
Variant_B y
""";
var constructors = List.of(
"Sum_Type",
"Sum_Type.Variant_A",
"Sum_Type.Variant_B",
"Sum_Type.Variant_A 'A'",
"Sum_Type.Variant_B 'B'"
);
var constructorTypes = Arrays.asList(new String[] {
"Sum_Type",
null,
null,
null,
null
});
collect.addAll(createValuesOfCustomType(code, constructors, constructorTypes));
}
return collect;
}

View File

@ -62,10 +62,10 @@ spec = Test.group "Examples" <|
Examples.My_Error.Error
Test.specify "should provide a method that throws an error" <|
Examples.throw_error.should_fail_with Examples.My_Error.Error
Examples.throw_error.should_fail_with Examples.My_Error
Test.specify "should provide a method that throws a panic" <|
Test.expect_panic_with Examples.throw_panic Examples.My_Error.Error
Test.expect_panic_with Examples.throw_panic Examples.My_Error
Test.specify "should provide a URL for some geo data" <|
(Examples.geo_data_url.length > 0) . should_be_true

View File

@ -31,8 +31,10 @@ spec =
identity.get 0 0 . should_equal [1]
identity.get 1 0 . should_equal [0]
identity.get 1 1 . should_equal [1]
identity.get 10 10 . should_fail_with Matrix_Error.Index_Out_Of_Bounds
identity.get -1 -1 . should_fail_with Matrix_Error.Index_Out_Of_Bounds
identity.get 10 10 . should_fail_with Matrix_Error
identity.get 10 10 . catch . should_be_a Matrix_Error.Index_Out_Of_Bounds
identity.get -1 -1 . should_fail_with Matrix_Error
identity.get -1 -1 . catch . should_be_a Matrix_Error.Index_Out_Of_Bounds
Test.specify "should be able to add a scalar" <|
zeros+1 . should_equal ones
@ -126,8 +128,10 @@ spec =
identity.get 0 0 . should_equal [1, 0]
identity.get 1 0 . should_equal [0, 0]
identity.get 1 1 . should_equal [1, 0]
identity.get 10 10 . should_fail_with Matrix_Error.Index_Out_Of_Bounds
identity.get -1 -1 . should_fail_with Matrix_Error.Index_Out_Of_Bounds
identity.get 10 10 . should_fail_with Matrix_Error
identity.get 10 10 . catch . should_be_a Matrix_Error.Index_Out_Of_Bounds
identity.get -1 -1 . should_fail_with Matrix_Error
identity.get -1 -1 . catch . should_be_a Matrix_Error.Index_Out_Of_Bounds
Test.specify "should be able to add a scalar" <|
zeros+1 . should_equal ones
@ -222,8 +226,10 @@ spec =
identity.get 0 0 . should_equal [1, 0, 0]
identity.get 1 0 . should_equal [0, 0, 0]
identity.get 1 1 . should_equal [1, 0, 0]
identity.get 10 10 . should_fail_with Matrix_Error.Index_Out_Of_Bounds
identity.get -1 -1 . should_fail_with Matrix_Error.Index_Out_Of_Bounds
identity.get 10 10 . should_fail_with Matrix_Error
identity.get 10 10 . catch . should_be_a Matrix_Error.Index_Out_Of_Bounds
identity.get -1 -1 . should_fail_with Matrix_Error
identity.get -1 -1 . catch . should_be_a Matrix_Error.Index_Out_Of_Bounds
Test.specify "should be able to add a scalar" <|
zeros+1 . should_equal ones
@ -318,8 +324,10 @@ spec =
identity.get 0 0 . should_equal [1, 0, 0, 0]
identity.get 1 0 . should_equal [0, 0, 0, 0]
identity.get 1 1 . should_equal [1, 0, 0, 0]
identity.get 10 10 . should_fail_with Matrix_Error.Index_Out_Of_Bounds
identity.get -1 -1 . should_fail_with Matrix_Error.Index_Out_Of_Bounds
identity.get 10 10 . should_fail_with Matrix_Error
identity.get 10 10 . catch . should_be_a Matrix_Error.Index_Out_Of_Bounds
identity.get -1 -1 . should_fail_with Matrix_Error
identity.get -1 -1 . catch . should_be_a Matrix_Error.Index_Out_Of_Bounds
Test.specify "should be able to add a scalar" <|
zeros+1 . should_equal ones

View File

@ -42,8 +42,10 @@ spec =
identity.get 0 0 . should_equal [1]
identity.get 1 0 . should_equal [0]
identity.get 1 1 . should_equal [1]
identity.get 10 10 . should_fail_with Matrix_Error.Index_Out_Of_Bounds
identity.get -1 -1 . should_fail_with Matrix_Error.Index_Out_Of_Bounds
identity.get 10 10 . should_fail_with Matrix_Error
identity.get 10 10 . catch . should_be_a Matrix_Error.Index_Out_Of_Bounds
identity.get -1 -1 . should_fail_with Matrix_Error
identity.get -1 -1 . catch . should_be_a Matrix_Error.Index_Out_Of_Bounds
Test.specify "should be able to add a scalar" <|
zeros+1 . should_equal ones
@ -140,8 +142,10 @@ spec =
identity.get 0 0 . should_equal [1, 0]
identity.get 1 0 . should_equal [0, 0]
identity.get 1 1 . should_equal [1, 0]
identity.get 10 10 . should_fail_with Matrix_Error.Index_Out_Of_Bounds
identity.get -1 -1 . should_fail_with Matrix_Error.Index_Out_Of_Bounds
identity.get 10 10 . should_fail_with Matrix_Error
identity.get 10 10 . catch . should_be_a Matrix_Error.Index_Out_Of_Bounds
identity.get -1 -1 . should_fail_with Matrix_Error
identity.get -1 -1 . catch . should_be_a Matrix_Error.Index_Out_Of_Bounds
Test.specify "should be able to add a scalar" <|
zeros+1 . should_equal (Matrix.from_vector (Vector.fill 9*2 1) rows=3 channels=2)
@ -241,8 +245,10 @@ spec =
identity.get 0 0 . should_equal [1, 0, 0]
identity.get 1 0 . should_equal [0, 0, 0]
identity.get 1 1 . should_equal [1, 0, 0]
identity.get 10 10 . should_fail_with Matrix_Error.Index_Out_Of_Bounds
identity.get -1 -1 . should_fail_with Matrix_Error.Index_Out_Of_Bounds
identity.get 10 10 . should_fail_with Matrix_Error
identity.get 10 10 . catch . should_be_a Matrix_Error.Index_Out_Of_Bounds
identity.get -1 -1 . should_fail_with Matrix_Error
identity.get -1 -1 . catch . should_be_a Matrix_Error.Index_Out_Of_Bounds
Test.specify "should be able to add a scalar" <|
zeros+1 . should_equal (Matrix.from_vector (Vector.fill 9*3 1) rows=3 channels=3)
@ -342,8 +348,10 @@ spec =
identity.get 0 0 . should_equal [1, 0, 0, 0]
identity.get 1 0 . should_equal [0, 0, 0, 0]
identity.get 1 1 . should_equal [1, 0, 0, 0]
identity.get 10 10 . should_fail_with Matrix_Error.Index_Out_Of_Bounds
identity.get -1 -1 . should_fail_with Matrix_Error.Index_Out_Of_Bounds
identity.get 10 10 . should_fail_with Matrix_Error
identity.get 10 10 . catch . should_be_a Matrix_Error.Index_Out_Of_Bounds
identity.get -1 -1 . should_fail_with Matrix_Error
identity.get -1 -1 . catch . should_be_a Matrix_Error.Index_Out_Of_Bounds
Test.specify "should be able to add a scalar" <|
zeros+1 . should_equal (Matrix.from_vector (Vector.fill 9*4 1) rows=3 channels=4)

View File

@ -24,7 +24,9 @@ spec =
Test.group "Image.read" pending=pending <|
Test.specify "should return error when read failed" <|
Image.read (enso_project.root / 'no_such_file.png') . should_fail_with File_Error.IO_Error
result = Image.read (enso_project.root / 'no_such_file.png')
result . should_fail_with File_Error
result.catch.should_be_a File_Error.IO_Error
Test.specify "should read a color image" <|
img = Image.read rgba_file
img.rows.should_equal 160
@ -43,7 +45,9 @@ spec =
Test.specify "should return error when write failed" <|
out_file = enso_project.root / "no_such_directory" / "out.png"
Image.read rgba_file . write out_file . should_fail_with File_Error.IO_Error
result = Image.read rgba_file . write out_file
result.should_fail_with File_Error
result.catch.should_be_a File_Error.IO_Error
Test.specify "should write a PNG file with alpha channel" <|
out_file = enso_project.root / "out_alpha.png"
Image.read rgba_file Read_Flag.Alpha_Channel . write out_file

View File

@ -1412,7 +1412,7 @@ spec setup =
new_table = table.aggregate [Group_By "Float", Count]
problems = Problems.get_attached_warnings new_table
problems.length . should_equal 1
problems.at 0 . is_a Floating_Point_Equality.Error . should_be_true
problems.at 0 . should_be_a Floating_Point_Equality
problems.at 0 . location . should_equal "Float"
if is_database then

View File

@ -34,7 +34,7 @@ spec setup =
column_1.name . should_equal "bar"
column_1.to_vector . should_equal [4, 5, 6]
table.at "nonexistent column name" . should_fail_with No_Such_Column.Error
table.at "nonexistent column name" . should_fail_with No_Such_Column
Test.specify "should allow selecting columns by index" <|
column_1 = table.at
@ -61,10 +61,10 @@ spec setup =
column_6.name . should_equal "abcd123"
column_6.to_vector . should_equal [19, 20, 21]
table.at 100 . should_fail_with Index_Out_Of_Bounds.Error
table.at 100 . should_fail_with Index_Out_Of_Bounds
Test.specify "should fail with Type Error is not an Integer or Text" <|
table.at (Pair.new 1 2) . should_fail_with Illegal_Argument.Error
table.at (Pair.new 1 2) . should_fail_with Illegal_Argument
table.at (Pair.new 1 2) . catch . to_display_text . should_equal "Illegal Argument: expected 'selector' to be either a Text or an Integer, but got Pair.Value."
Test.group prefix+"Table.get" <|
@ -93,7 +93,7 @@ spec setup =
table.get 100 column_1 . name . should_equal "foo"
Test.specify "should fail with Type Error is not an Integer or Text" <|
table.get (Pair.new 1 2) . should_fail_with Illegal_Argument.Error
table.get (Pair.new 1 2) . should_fail_with Illegal_Argument
table.get (Pair.new 1 2) . catch . to_display_text . should_equal "Illegal Argument: expected 'selector' to be either a Text or an Integer, but got Pair.Value."
Test.group prefix+"Table.set" <|
@ -117,10 +117,10 @@ spec setup =
Test.specify "should allow adding a column" <|
bar2 = table.get "bar" . rename "bar2"
table.set bar2 set_mode=Set_Mode.Update . should_fail_with Missing_Column.Error
table.set bar2 set_mode=Set_Mode.Update . should_fail_with Missing_Column
foo = table.get "bar" . rename "foo"
table.set foo set_mode=Set_Mode.Add . should_fail_with Existing_Column.Error
table.set foo set_mode=Set_Mode.Add . should_fail_with Existing_Column
Test.specify "should not affect existing columns that depended on the old column being replaced" <|
t1 = table_builder [["X", [1,2,3]]]
@ -135,7 +135,8 @@ spec setup =
Test.specify "should gracefully handle expression failures" <|
t1 = table_builder [["X", [1,2,3]]]
t1.set "[unknown] + 10" new_name="Z" . should_fail_with No_Such_Column
t1.set "[[[[" . should_fail_with Expression_Error.Syntax_Error
t1.set "[[[[" . should_fail_with Expression_Error
t1.set "[[[[" . catch . should_be_a Expression_Error.Syntax_Error
Test.specify "should forward expression problems" <|
t1 = table_builder [["X", [1.5, 2.0, 0.0]]]
@ -226,11 +227,11 @@ spec setup =
table.rows max_rows=2 . map .to_vector . should_equal [[1, 5, "A"], [2, 6, "B"]]
Test.specify "should correctly handle errors" <|
table.rows.at 5 . should_fail_with Index_Out_Of_Bounds.Error
table.rows.at 5 . should_fail_with Index_Out_Of_Bounds
err = table.rows.at -6
err.should_fail_with Index_Out_Of_Bounds.Error
err.should_fail_with Index_Out_Of_Bounds
err.catch . should_equal (Index_Out_Of_Bounds.Error -6 4)
table.rows (max_rows=2) . at 2 . should_fail_with Index_Out_Of_Bounds.Error
table.rows . at 0 . at -4 . should_fail_with Index_Out_Of_Bounds.Error
table.rows . at 0 . at "unknown" . should_fail_with No_Such_Column.Error
table.rows (max_rows=2) . at 2 . should_fail_with Index_Out_Of_Bounds
table.rows . at 0 . at -4 . should_fail_with Index_Out_Of_Bounds
table.rows . at 0 . at "unknown" . should_fail_with No_Such_Column

View File

@ -141,7 +141,7 @@ spec setup =
Test.specify "should not allow Group_By for values" <|
err1 = table.cross_tab [] "Key" values=[Count, Group_By "Value"] on_problems=Problem_Behavior.Ignore
err1.should_fail_with Illegal_Argument.Error
err1.should_fail_with Illegal_Argument
Test.specify "should gracefully handle duplicate aggregate names" pending="TODO: this should be fixed as part of https://github.com/enso-org/enso/issues/5151" <|
action = table.cross_tab [] "Key" values=[Count new_name="Agg1", Sum "Value" new_name="Agg1"]

View File

@ -283,8 +283,9 @@ spec detailed setup =
expression_test "max([A], [B], 3)" [3, 3, 3, 4, 6]
Test.group prefix+"Expression Errors should be handled" <|
error_tester expression fail_type =
test_table.set expression new_name="NEW_COL" . should_fail_with fail_type
error_tester expression fail_ctor =
test_table.set expression new_name="NEW_COL" . should_fail_with Expression_Error
test_table.set expression new_name="NEW_COL" . catch . should_be_a fail_ctor
specify_test "should fail with Syntax_Error if badly formed" expression_test=error_tester expression_test->
expression_test "IIF [A] THEN 1 ELSE 2" Expression_Error.Syntax_Error
@ -298,7 +299,7 @@ spec detailed setup =
expression_test "starts_with([C])" Expression_Error.Argument_Mismatch
specify_test "should fail with Argument_Mismatch if too many arguments" expression_test=error_tester expression_test->
expression_test "Not([C], 'Hello')" Expression_Error.Argument_Mismatch
expression_test "is_empty([C], 'Hello')" Expression_Error.Argument_Mismatch
Test.group prefix+"Expression Warnings should be reported" <|
Test.specify "should report floating point equality" <|

View File

@ -45,7 +45,7 @@ spec setup =
v = t.filter "X" (Filter_Condition.Equal to="SOME TEXT :)") . at "X" . to_vector
case test_selection.allows_mixed_type_comparisons of
True -> v.should_equal []
False -> v.should_fail_with SQL_Error.Error
False -> v.should_fail_with SQL_Error
t.filter "X" (Filter_Condition.Equal to=(t.at "Y")) . at "X" . to_vector . should_equal [100]
t.filter "X" (Filter_Condition.Less than=(t.at "Y")) . at "X" . to_vector . should_equal [3]
@ -67,7 +67,7 @@ spec setup =
v = t.filter "X" (Filter_Condition.Equal to=52) . at "X" . to_vector
case test_selection.allows_mixed_type_comparisons of
True -> v.should_equal []
False -> v.should_fail_with SQL_Error.Error
False -> v.should_fail_with SQL_Error
t.filter "X" (Filter_Condition.Greater than=(t.at "Y")) . at "X" . to_vector . should_equal ["abb", "baca"]
t.filter "X" (Filter_Condition.Equal_Or_Greater than=(t.at "Y")) . at "X" . to_vector . should_equal ["abb", "baca", "b", "c"]
@ -154,7 +154,7 @@ spec setup =
Test.specify "should check types for text operations" <|
t = table_builder [["ix", [1, 2, 3, 4]], ["X", [Nothing, "A", "", " "]]]
check_problem result =
result.should_fail_with Invalid_Value_Type.Error
result.should_fail_with Invalid_Value_Type
result.catch.expected . should_equal Value_Type.Char
check_problem (t.filter "X" (Filter_Condition.Starts_With (t.at "ix")))
@ -175,7 +175,7 @@ spec setup =
check_problem (t.filter "ix" Filter_Condition.Not_Empty)
check_scalar_type_error_handling name action =
action.should_fail_with Type_Error.Error
action.should_fail_with Type_Error
action.catch . should_equal (Type_Error.Error Text Integer name)
check_scalar_type_error_handling "prefix" (t.filter "X" (Filter_Condition.Starts_With 42))
@ -222,11 +222,11 @@ spec setup =
v1 = t.filter "X" (Filter_Condition.Is_In ["c", "f", "b", "b", "b", 15, Nothing]) . at "X" . to_vector
case test_selection.allows_mixed_type_comparisons of
True -> v1.should_equal ["b", "f"]
False -> v1.should_fail_with SQL_Error.Error
False -> v1.should_fail_with SQL_Error
v2 = t.filter "ix" (Filter_Condition.Is_In ["c", 3, 2, "a"]) . at "ix" . to_vector
case test_selection.allows_mixed_type_comparisons of
True -> v2.should_equal [2, 3]
False -> v2.should_fail_with SQL_Error.Error
False -> v2.should_fail_with SQL_Error
t2 = table_builder [["A", [True, False, True]], ["B", [False, False, False]], ["C", [True, False, Nothing]]]
t2.filter "A" (Filter_Condition.Is_In (t1.at "bool")) . at "A" . to_vector . should_equal [True, True]
@ -254,7 +254,7 @@ spec setup =
Test.specify "should check types of boolean operations" <|
t = table_builder [["ix", [1, 2, 3, 4, 5]], ["b", [True, False, Nothing, True, True]]]
check_problem result =
result.should_fail_with Invalid_Value_Type.Error
result.should_fail_with Invalid_Value_Type
result.catch.expected . should_equal Value_Type.Boolean
check_problem <| t.filter "ix" Filter_Condition.Is_True
@ -266,12 +266,12 @@ spec setup =
Test.specify "should handle selection errors: unknown column name" <|
t = table_builder [["X", [10, 20, 13, 4, 5]]]
t.filter "unknown column" . should_fail_with No_Such_Column.Error
t.filter "unknown column" . should_fail_with No_Such_Column
t.filter "unknown column" . catch . should_equal (No_Such_Column.Error "unknown column")
Test.specify "should handle selection errors: out of bounds index" <|
t = table_builder [["X", [10, 20, 13, 4, 5]]]
t.filter 4 . should_fail_with Index_Out_Of_Bounds.Error
t.filter 4 . should_fail_with Index_Out_Of_Bounds
t.filter 4 . catch . should_equal (Index_Out_Of_Bounds.Error 4 1)
Test.specify "should report issues: floating point equality" <|
@ -339,11 +339,14 @@ spec setup =
Test.specify "fail gracefully" <|
t = table_builder [["ix", [1, 2, 3, 4, 5]], ["b", [True, False, Nothing, True, True]]]
t.filter_by_expression "[ix" . should_fail_with Expression_Error.Syntax_Error
t.filter_by_expression "NOT(b,False)" . should_fail_with Expression_Error.Argument_Mismatch
t.filter_by_expression "Starts_With(b)" . should_fail_with Expression_Error.Argument_Mismatch
t.filter_by_expression "[missing]" . should_fail_with No_Such_Column.Error
t.filter_by_expression "[ix]" . should_fail_with Invalid_Value_Type.Error
t.filter_by_expression "[ix" . should_fail_with Expression_Error
t.filter_by_expression "[ix" . catch . should_be_a Expression_Error.Syntax_Error
t.filter_by_expression "is_empty([b],False)" . should_fail_with Expression_Error
t.filter_by_expression "is_empty([b],False)" . catch . should_be_a Expression_Error.Argument_Mismatch
t.filter_by_expression "Starts_With([b])" . should_fail_with Expression_Error
t.filter_by_expression "Starts_With([b])" . catch . should_be_a Expression_Error.Argument_Mismatch
t.filter_by_expression "[missing]" . should_fail_with No_Such_Column
t.filter_by_expression "[ix]" . should_fail_with Invalid_Value_Type
Test.specify "should report issues: floating point equality" <|
t = table_builder [["ix", [1, 2, 3, 4, 5]], ["X", [10.0, 2.0001, 2.0, 4.5, -2.0]]]

View File

@ -17,11 +17,11 @@ type My_Type
type My_Type_Comparator
is_ordered = True
compare my_1 my_2 =
comp = Comparable.from my_1.x
comp.compare (my_1.x + my_1.y) (my_2.x + my_2.y)
hash my_type = Comparable.from my_type.x . hash (my_type.x + my_type.y)
Comparable.from (_:My_Type) = My_Type_Comparator
@ -56,7 +56,7 @@ spec setup =
t3.at "Z" . to_vector . should_equal [4, Nothing, 2, 2, 3]
t3.at "W" . to_vector . should_equal [7, Nothing, 4, 6, 5]
False ->
t3.should_fail_with Unsupported_Database_Operation.Error
t3.should_fail_with Unsupported_Database_Operation
Test.specify "should allow Left Outer join" <|
@ -301,11 +301,11 @@ spec setup =
- Missing_Input_Columns.Error ["foo", "baz"]
here, but we can throw only one error. I think column names error
will be more useful, so I'd prioritize it.
r1.should_fail_with Missing_Input_Columns.Error
r1.should_fail_with Missing_Input_Columns
r1.catch.criteria.should_equal ["foo", "baz"]
r2 = t1.join t2 on=[Join_Condition.Equals 42 0] on_problems=Problem_Behavior.Ignore
r2.should_fail_with Column_Indexes_Out_Of_Range.Error
r2.should_fail_with Column_Indexes_Out_Of_Range
r2.catch.indexes.should_equal [42]
Test.specify "should report Invalid_Value_Type if non-text columns are provided to Equals_Ignore_Case" <|
@ -313,7 +313,7 @@ spec setup =
t2 = table_builder [["Z", ["1", "2", "c"]], ["W", [1, 2, 3]]]
test result =
result.should_fail_with Invalid_Value_Type.Error
result.should_fail_with Invalid_Value_Type
result.catch.expected.should_equal Value_Type.Char
test <|
@ -326,14 +326,14 @@ spec setup =
t2 = table_builder ["Y", [1, 2, 3]]
r1 = t1.join t2 on_problems=Problem_Behavior.Ignore
r1.should_fail_with Invalid_Value_Type.Error
r1.should_fail_with Invalid_Value_Type
Test.specify "should report Invalid_Value_Type if incompatible columns types are correlated in Between" pending="We need more advanced value type support to implement this in full-generality." <|
t1 = table_builder ["X", ["1", "2", "c"], ["Y", [1, 2, 3]]]
t2 = table_builder ["Z", ["1", "2", "c"], ["W", [1, 2, 3]]]
test expected actual err =
err.should_fail_with Invalid_Value_Type.Error
err.should_fail_with Invalid_Value_Type
err.catch . should_equal (Invalid_Value_Type.Error expected actual)
test Value_Type.Char Value_Type.Integer <|
@ -469,8 +469,8 @@ spec setup =
Test.specify "should pass dataflow errors through" <|
error = Error.throw (Illegal_State.Error "FOO")
t1.join error . should_fail_with Illegal_State.Error
t1.join t2 on=[error, "X"] . should_fail_with Illegal_State.Error
t1.join error . should_fail_with Illegal_State
t1.join t2 on=[error, "X"] . should_fail_with Illegal_State
Test.specify "should correctly handle all null rows" pending=db_todo <|
t1 = table_builder [["A", [Nothing, 2, Nothing, 1]], ["B", [Nothing, 3, 4, 7]]]
@ -502,7 +502,7 @@ spec setup =
r4.at 5 . should_equal [1, 7, Nothing, Nothing]
r4.at 6 . should_equal [2, 3, 2, 5]
False ->
(materialize t4) . should_fail_with Unsupported_Database_Operation.Error
(materialize t4) . should_fail_with Unsupported_Database_Operation
t4_2 = t1.join t2 on=[Join_Condition.Equals "A" "C"] join_kind=Join_Kind.Left_Outer
expect_column_names ["A", "B", "C", "D"] t4_2

View File

@ -107,7 +107,7 @@ spec setup =
if test_selection.is_nan_and_nothing_distinct.not then
Test.specify "this backend treats NaN as Nothing" <|
t3.at "X" . to_vector . should_equal [2.0, 1.5, Nothing, Nothing]
t3.at "X" . is_nan . to_vector . should_fail_with Unsupported_Database_Operation.Error
t3.at "X" . is_nan . to_vector . should_fail_with Unsupported_Database_Operation
Test.specify "Blank_Columns selector should work for all kinds of methods accepting Column_Selector" <|
t = table_builder [["X", [1, 2, 3, 4]], ["Y", [Nothing, "", Nothing, Nothing]], ["Z", [Nothing, True, False, Nothing]]]

View File

@ -271,4 +271,4 @@ spec setup =
if setup.is_database.not then
Test.specify "should raise Incomparable_Values if ordering by incomparable values" <|
t = table_builder [["X", [My_Type.Foo 42, My_Type.Foo "a"]]]
t.order_by "X" . should_fail_with Incomparable_Values.Error
t.order_by "X" . should_fail_with Incomparable_Values

View File

@ -64,26 +64,26 @@ spec setup =
Test.specify "should allow selecting rows by ranges or indices" <|
table.take (2.up_to 4) . at "beta" . to_vector . should_equal ["C", "D"]
table.take (0.up_to 0) . should_equal empty
table.take (100.up_to 100) . should_fail_with Index_Out_Of_Bounds.Error
table.take (100.up_to 100) . should_fail_with Index_Out_Of_Bounds
table.take (100.up_to 100) . catch . should_equal (Index_Out_Of_Bounds.Error 100 8)
table.take (0.up_to 100) . should_equal table
table.take (0.up_to table.row_count) . should_equal table
empty.take (0.up_to 0) . should_fail_with Index_Out_Of_Bounds.Error
empty.take (0.up_to 0) . should_fail_with Index_Out_Of_Bounds
empty.take (0.up_to 0) . catch . should_equal (Index_Out_Of_Bounds.Error 0 0)
table.take (100.up_to 99) . should_fail_with Index_Out_Of_Bounds.Error
table.take (100.up_to 99) . should_fail_with Index_Out_Of_Bounds
table.drop (2.up_to 4) . at "alpha" . to_vector . should_equal [1, 2, 5, 6, 7, 8]
table.drop (0.up_to 0) . should_equal table
table.drop (100.up_to 100) . should_fail_with Index_Out_Of_Bounds.Error
table.drop (100.up_to 100) . should_fail_with Index_Out_Of_Bounds
table.drop (100.up_to 100) . catch . should_equal (Index_Out_Of_Bounds.Error 100 8)
table.drop (0.up_to 100) . should_equal empty
table.drop (0.up_to table.row_count) . should_equal empty
empty.drop (0.up_to 0) . should_fail_with Index_Out_Of_Bounds.Error
empty.drop (0.up_to 0) . should_fail_with Index_Out_Of_Bounds
empty.drop (0.up_to 0) . catch . should_equal (Index_Out_Of_Bounds.Error 0 0)
table.drop (100.up_to 99) . should_fail_with Index_Out_Of_Bounds.Error
table.drop (100.up_to 99) . should_fail_with Index_Out_Of_Bounds
table.take (Index_Sub_Range.By_Index 0) . at "beta" . to_vector . should_equal ["A"]
empty.take (Index_Sub_Range.By_Index 0) . should_fail_with Index_Out_Of_Bounds.Error
empty.take (Index_Sub_Range.By_Index 0) . should_fail_with Index_Out_Of_Bounds
table.take (Index_Sub_Range.By_Index []) . should_equal empty
table.take (Index_Sub_Range.By_Index [-1, -1]) . at "beta" . to_vector . should_equal ["H", "H"]
table.take (Index_Sub_Range.By_Index [0, 0, 3.up_to 100]) . at "alpha" . to_vector . should_equal [1, 1, 4, 5, 6, 7, 8]
@ -91,8 +91,8 @@ spec setup =
table.take (Index_Sub_Range.By_Index [0.up_to 100 . with_step 2, 1.up_to 6 . with_step 2]) . at "alpha" . to_vector . should_equal [1, 3, 5, 7, 2, 4, 6]
table.take (Index_Sub_Range.By_Index [1.up_to 3, 2.up_to 5]) . at "alpha" . to_vector . should_equal [2, 3, 3, 4, 5]
table.take (Index_Sub_Range.By_Index [2.up_to 5, 1.up_to 3]) . at "alpha" . to_vector . should_equal [3, 4, 5, 2, 3]
table.take (Index_Sub_Range.By_Index [0, 1, 100.up_to 200]) . should_fail_with Index_Out_Of_Bounds.Error
table.take (Index_Sub_Range.By_Index 100) . should_fail_with Index_Out_Of_Bounds.Error
table.take (Index_Sub_Range.By_Index [0, 1, 100.up_to 200]) . should_fail_with Index_Out_Of_Bounds
table.take (Index_Sub_Range.By_Index 100) . should_fail_with Index_Out_Of_Bounds
table.drop (Index_Sub_Range.By_Index 0) . at "alpha" . to_vector . should_equal [2, 3, 4, 5, 6, 7, 8]
table.drop (Index_Sub_Range.By_Index []) . should_equal table
@ -102,8 +102,8 @@ spec setup =
table.drop (Index_Sub_Range.By_Index [0.up_to 100 . with_step 2, 1.up_to 6 . with_step 2]) . at "alpha" . to_vector . should_equal [8]
table.drop (Index_Sub_Range.By_Index [1.up_to 3, 2.up_to 5]) . at "alpha" . to_vector . should_equal [1, 6, 7, 8]
table.drop (Index_Sub_Range.By_Index [2.up_to 5, 1.up_to 3]) . at "alpha" . to_vector . should_equal [1, 6, 7, 8]
table.drop (Index_Sub_Range.By_Index [0, 1, 100.up_to 200]) . should_fail_with Index_Out_Of_Bounds.Error
table.drop (Index_Sub_Range.By_Index 100) . should_fail_with Index_Out_Of_Bounds.Error
table.drop (Index_Sub_Range.By_Index [0, 1, 100.up_to 200]) . should_fail_with Index_Out_Of_Bounds
table.drop (Index_Sub_Range.By_Index 100) . should_fail_with Index_Out_Of_Bounds
Test.specify "should allow selecting every Nth row" <|
table.take (Every 1) . should_equal table
@ -113,8 +113,8 @@ spec setup =
table.take (Every 2 first=100) . at "alpha" . to_vector . should_equal []
table.take (Every 200) . at "alpha" . to_vector . should_equal [1]
empty.take (Every 2) . should_equal empty
table.take (Every 0) . should_fail_with Illegal_Argument.Error
empty.take (Every 0) . should_fail_with Illegal_Argument.Error
table.take (Every 0) . should_fail_with Illegal_Argument
empty.take (Every 0) . should_fail_with Illegal_Argument
table.drop (Every 1) . should_equal empty
table.drop (Every 3) . at "alpha" . to_vector . should_equal [2, 3, 5, 6, 8]
@ -123,8 +123,8 @@ spec setup =
table.drop (Every 2 first=100) . should_equal table
table.drop (Every 200) . at "beta" . to_vector . should_equal ["B", "C", "D", "E", "F", "G", "H"]
empty.drop (Every 2) . should_equal empty
table.drop (Every 0) . should_fail_with Illegal_Argument.Error
empty.drop (Every 0) . should_fail_with Illegal_Argument.Error
table.drop (Every 0) . should_fail_with Illegal_Argument
empty.drop (Every 0) . should_fail_with Illegal_Argument
Test.specify "should allow sampling rows" <|
empty = table_builder [["X", []]]
@ -204,26 +204,26 @@ spec setup =
Test.specify "should allow selecting rows by ranges or indices" <|
beta.take (2.up_to 4) . to_vector . should_equal ["C", "D"]
beta.take (0.up_to 0) . should_equal empty_beta
beta.take (100.up_to 100) . should_fail_with Index_Out_Of_Bounds.Error
beta.take (100.up_to 100) . should_fail_with Index_Out_Of_Bounds
beta.take (100.up_to 100) . catch . should_equal (Index_Out_Of_Bounds.Error 100 8)
beta.take (0.up_to 100) . should_equal beta
beta.take (0.up_to table.row_count) . should_equal beta
empty_beta.take (0.up_to 0) . should_fail_with Index_Out_Of_Bounds.Error
empty_beta.take (0.up_to 0) . should_fail_with Index_Out_Of_Bounds
empty_beta.take (0.up_to 0) . catch . should_equal (Index_Out_Of_Bounds.Error 0 0)
beta.take (100.up_to 99) . should_fail_with Index_Out_Of_Bounds.Error
beta.take (100.up_to 99) . should_fail_with Index_Out_Of_Bounds
alpha.drop (2.up_to 4) . to_vector . should_equal [1, 2, 5, 6, 7, 8]
alpha.drop (0.up_to 0) . should_equal alpha
alpha.drop (100.up_to 100) . should_fail_with Index_Out_Of_Bounds.Error
alpha.drop (100.up_to 100) . should_fail_with Index_Out_Of_Bounds
alpha.drop (100.up_to 100) . catch . should_equal (Index_Out_Of_Bounds.Error 100 8)
alpha.drop (0.up_to 100) . should_equal empty_alpha
alpha.drop (0.up_to table.row_count) . should_equal empty_alpha
empty_alpha.drop (0.up_to 0) . should_fail_with Index_Out_Of_Bounds.Error
empty_alpha.drop (0.up_to 0) . should_fail_with Index_Out_Of_Bounds
empty_alpha.drop (0.up_to 0) . catch . should_equal (Index_Out_Of_Bounds.Error 0 0)
alpha.drop (100.up_to 99) . should_fail_with Index_Out_Of_Bounds.Error
alpha.drop (100.up_to 99) . should_fail_with Index_Out_Of_Bounds
beta.take (Index_Sub_Range.By_Index 0) . to_vector . should_equal ["A"]
empty_beta.take (Index_Sub_Range.By_Index 0) . should_fail_with Index_Out_Of_Bounds.Error
empty_beta.take (Index_Sub_Range.By_Index 0) . should_fail_with Index_Out_Of_Bounds
beta.take (Index_Sub_Range.By_Index []) . should_equal empty_beta
beta.take (Index_Sub_Range.By_Index [-1, -1]) . to_vector . should_equal ["H", "H"]
alpha.take (Index_Sub_Range.By_Index [0, 0, 3.up_to 100]) . to_vector . should_equal [1, 1, 4, 5, 6, 7, 8]
@ -231,8 +231,8 @@ spec setup =
alpha.take (Index_Sub_Range.By_Index [0.up_to 100 . with_step 2, 1.up_to 6 . with_step 2]) . to_vector . should_equal [1, 3, 5, 7, 2, 4, 6]
alpha.take (Index_Sub_Range.By_Index [1.up_to 3, 2.up_to 5]) . to_vector . should_equal [2, 3, 3, 4, 5]
alpha.take (Index_Sub_Range.By_Index [2.up_to 5, 1.up_to 3]) . to_vector . should_equal [3, 4, 5, 2, 3]
alpha.take (Index_Sub_Range.By_Index [0, 1, 100.up_to 200]) . should_fail_with Index_Out_Of_Bounds.Error
alpha.take (Index_Sub_Range.By_Index 100) . should_fail_with Index_Out_Of_Bounds.Error
alpha.take (Index_Sub_Range.By_Index [0, 1, 100.up_to 200]) . should_fail_with Index_Out_Of_Bounds
alpha.take (Index_Sub_Range.By_Index 100) . should_fail_with Index_Out_Of_Bounds
alpha.drop (Index_Sub_Range.By_Index 0) . to_vector . should_equal [2, 3, 4, 5, 6, 7, 8]
alpha.drop (Index_Sub_Range.By_Index []) . should_equal alpha
@ -242,8 +242,8 @@ spec setup =
alpha.drop (Index_Sub_Range.By_Index [0.up_to 100 . with_step 2, 1.up_to 6 . with_step 2]) . to_vector . should_equal [8]
alpha.drop (Index_Sub_Range.By_Index [1.up_to 3, 2.up_to 5]) . to_vector . should_equal [1, 6, 7, 8]
alpha.drop (Index_Sub_Range.By_Index [2.up_to 5, 1.up_to 3]) . to_vector . should_equal [1, 6, 7, 8]
alpha.drop (Index_Sub_Range.By_Index [0, 1, 100.up_to 200]) . should_fail_with Index_Out_Of_Bounds.Error
alpha.drop (Index_Sub_Range.By_Index 100) . should_fail_with Index_Out_Of_Bounds.Error
alpha.drop (Index_Sub_Range.By_Index [0, 1, 100.up_to 200]) . should_fail_with Index_Out_Of_Bounds
alpha.drop (Index_Sub_Range.By_Index 100) . should_fail_with Index_Out_Of_Bounds
Test.specify "should allow selecting every Nth row" <|
alpha.take (Every 1) . should_equal alpha
@ -253,8 +253,8 @@ spec setup =
alpha.take (Every 2 first=100) . to_vector . should_equal []
alpha.take (Every 200) . to_vector . should_equal [1]
empty_beta.take (Every 2) . should_equal empty_beta
beta.take (Every 0) . should_fail_with Illegal_Argument.Error
empty_beta.take (Every 0) . should_fail_with Illegal_Argument.Error
beta.take (Every 0) . should_fail_with Illegal_Argument
empty_beta.take (Every 0) . should_fail_with Illegal_Argument
alpha.drop (Every 1) . should_equal empty_alpha
alpha.drop (Every 3) . to_vector . should_equal [2, 3, 5, 6, 8]
@ -263,8 +263,8 @@ spec setup =
alpha.drop (Every 2 first=100) . should_equal alpha
beta.drop (Every 200) . to_vector . should_equal ["B", "C", "D", "E", "F", "G", "H"]
empty_beta.drop (Every 2) . should_equal empty_beta
beta.drop (Every 0) . should_fail_with Illegal_Argument.Error
empty_beta.drop (Every 0) . should_fail_with Illegal_Argument.Error
beta.drop (Every 0) . should_fail_with Illegal_Argument
empty_beta.drop (Every 0) . should_fail_with Illegal_Argument
Test.specify "should allow sampling rows" <|
three = table_builder [["X", ["a", "a", "a"]]] . at "X"

View File

@ -55,7 +55,7 @@ spec =
t3.to_sql.prepare . should_equal ['SELECT "T1"."C" AS "C", "T1"."B" AS "B", "T1"."A" AS "bar" FROM "T1" AS "T1"', []]
Test.specify "should fail if at is called for a non-existent column" <|
t1.at "undefined" . should_fail_with No_Such_Column.Error
t1.at "undefined" . should_fail_with No_Such_Column
Test.specify "should allow to limit the amount of returned results" <|
t2 = t1.limit 5

View File

@ -239,7 +239,7 @@ spec prefix connection =
t2.at "avg price" . to_vector . should_equal [(110.2 / 11)]
Test.group prefix+"Table.filter" <|
Test.specify "report error when trying to filter by a custom predicate" <|
t1.filter "a" (x -> x % 2 == 0) . should_fail_with Unsupported_Database_Operation.Error
t1.filter "a" (x -> x % 2 == 0) . should_fail_with Unsupported_Database_Operation
clean_table name = Panic.recover Any <|
sql = 'DROP TABLE "' + name + '"'

View File

@ -328,7 +328,7 @@ connection_setup_spec = Test.group "[PostgreSQL] Connection setup" <|
c1.jdbc_properties . should_equal <| add_ssl []
Test_Environment.unsafe_with_environment_override "PGPASSWORD" "somepassword" <|
c1.jdbc_properties . should_fail_with Illegal_State.Error
c1.jdbc_properties . should_fail_with Illegal_State
c1.jdbc_properties.catch.message . should_equal "PGPASSWORD is set, but PGUSER is not."
Test_Environment.unsafe_with_environment_override "PGUSER" "someuser" <|

View File

@ -27,8 +27,8 @@ sqlite_specific_spec prefix connection =
Meta.is_same_object connection (connection.set_schema Nothing) . should_be_true
Test.specify "does not allow changing schema or database" <|
connection.set_schema "foo" . should_fail_with SQL_Error.Error
connection.set_database "foo" . should_fail_with SQL_Error.Error
connection.set_schema "foo" . should_fail_with SQL_Error
connection.set_database "foo" . should_fail_with SQL_Error
Test.group prefix+"Tables and Table Types" <|
tinfo = Name_Generator.random_name "TestTable"
@ -67,11 +67,11 @@ sqlite_specific_spec prefix connection =
Test.group prefix+"Error Handling" <|
Test.specify "should wrap errors" <|
connection.read (SQL_Query.Raw_SQL "foobar") . should_fail_with SQL_Error.Error
connection.execute_update "foobar" . should_fail_with SQL_Error.Error
connection.read (SQL_Query.Raw_SQL "foobar") . should_fail_with SQL_Error
connection.execute_update "foobar" . should_fail_with SQL_Error
action = connection.read (SQL_Query.Raw_SQL "SELECT A FROM undefined_table")
action . should_fail_with SQL_Error.Error
action . should_fail_with SQL_Error
action.catch.to_text . should_equal "There was an SQL error: [SQLITE_ERROR] SQL error or missing database (no such table: undefined_table). [Query was: SELECT A FROM undefined_table]"
tinfo = Name_Generator.random_name "Tinfo"

View File

@ -165,7 +165,7 @@ spec =
formatter = Data_Formatter.Value true_values=["YES", "1", "true"] false_values=["NO", "0", "false"]
formatter.format True . should_equal "YES"
formatter.format False . should_equal "NO"
(Data_Formatter.Value true_values=[] false_values=[]).format True . should_fail_with Illegal_Argument.Error
(Data_Formatter.Value true_values=[] false_values=[]).format True . should_fail_with Illegal_Argument
Test.specify "should format dates" <|
formatter = Data_Formatter.Value
@ -198,8 +198,8 @@ spec =
Test.specify "should correctly pass through errors from custom type's `.to_text` method" pending="TODO: figure out the desired behavior, see: https://www.pivotaltracker.com/story/show/182522644" <|
formatter = Data_Formatter.Value
formatter.format Custom_Type_With_Error . should_fail_with Illegal_State.Error
Test.expect_panic_with (formatter.format Custom_Type_With_Panic) Illegal_State.Error
formatter.format Custom_Type_With_Error . should_fail_with Illegal_State
Test.expect_panic_with (formatter.format Custom_Type_With_Panic) Illegal_State
Test.group "DataFormatter builders" <|
# We create a formatter with all non-default values to ensure that the builders keep the existing values of other properties instead of switching to the constructor's defaults.

View File

@ -94,11 +94,13 @@ spec =
Test.specify "should correctly handle file opening issues" <|
nonexistent_file = enso_project.data / "a_filename_that_does_not_exist.foobar"
r1 = Data.read nonexistent_file (Delimited "," headers=True value_formatter=Nothing)
r1.should_fail_with File_Error.Not_Found
r1.should_fail_with File_Error
r1.catch.should_be_a File_Error.Not_Found
directory = enso_project.data
r2 = Data.read directory (Delimited "," headers=True value_formatter=Nothing) Problem_Behavior.Report_Error
r2.should_fail_with File_Error.IO_Error
r2.should_fail_with File_Error
r2.catch.should_be_a File_Error.IO_Error
Test.specify "should work with all kinds of line endings" <|
path name = enso_project.data / 'transient' / name
@ -123,7 +125,7 @@ spec =
# Currently mixed line endings are not supported.
'a,b,c\nd,e,f\r1,2,3'.write (path 'mixed.csv')
Data.read (path 'mixed.csv') (Delimited "," headers=True value_formatter=Nothing) Problem_Behavior.Report_Error . should_fail_with Invalid_Row.Error
Data.read (path 'mixed.csv') (Delimited "," headers=True value_formatter=Nothing) Problem_Behavior.Report_Error . should_fail_with Invalid_Row
['crlf.csv', 'lf.csv', 'cr.csv', 'mixed.csv'].each (path >> .delete)
@ -226,11 +228,13 @@ spec =
Test.specify "should fail in presence of a mismatched quote" <|
[Problem_Behavior.Report_Error, Problem_Behavior.Report_Warning, Problem_Behavior.Ignore].each pb->
r1 = Data.read (enso_project.data / "mismatched_quote.csv") (Delimited "," headers=True value_formatter=Nothing) on_problems=pb
r1.should_fail_with File_Error.Corrupted_Format
r1.should_fail_with File_Error
r1.catch.should_be_a File_Error.Corrupted_Format
r1.catch.to_display_text.should_contain "quote has been opened but never closed"
r2 = Data.read (enso_project.data / "mismatched_quote2.csv") (Delimited "," headers=True value_formatter=Nothing) on_problems=pb
r2.should_fail_with File_Error.Corrupted_Format
r2.should_fail_with File_Error
r2.catch.should_be_a File_Error.Corrupted_Format
Test.specify "should handle too long and too short rows" <|
action keep_invalid_rows on_problems =
@ -315,10 +319,10 @@ spec =
Test.specify "should check arguments" <|
path = (enso_project.data / "simple_empty.csv")
pb = Problem_Behavior.Report_Error
path.read (Delimited "," headers=False . with_quotes quote='abc') pb . should_fail_with Illegal_Argument.Error
path.read (Delimited "," headers=False . with_quotes quote='🚧') pb . should_fail_with Illegal_Argument.Error
path.read (Delimited "," headers=False . with_quotes quote_escape='//') pb . should_fail_with Illegal_Argument.Error
path.read (Delimited 'a\u{301}' headers=False) pb . should_fail_with Illegal_Argument.Error
path.read (Delimited "," headers=False . with_quotes quote='abc') pb . should_fail_with Illegal_Argument
path.read (Delimited "," headers=False . with_quotes quote='🚧') pb . should_fail_with Illegal_Argument
path.read (Delimited "," headers=False . with_quotes quote_escape='//') pb . should_fail_with Illegal_Argument
path.read (Delimited 'a\u{301}' headers=False) pb . should_fail_with Illegal_Argument
Test.specify "should correctly guess column types" <|
t = (enso_project.data / "data_small.csv") . read (Delimited "," headers=True)

View File

@ -232,7 +232,7 @@ spec =
file_2 = (enso_project.data / "transient" / "non-text_but_no_formatter.csv")
file_2.delete_if_exists
result_2 = table_2.write file_2 format
result_2 . should_fail_with Illegal_Argument.Error
result_2 . should_fail_with Illegal_Argument
text_2 = Data.read_text file_2
text_2.should_equal ""
@ -301,7 +301,7 @@ spec =
file.delete_if_exists
no_header_format = Delimited "," . without_headers
existing_table.write file no_header_format on_existing_file=Existing_File_Behavior.Overwrite
appending_table.write file on_existing_file=Existing_File_Behavior.Append . should_fail_with Illegal_Argument.Error
appending_table.write file on_existing_file=Existing_File_Behavior.Append . should_fail_with Illegal_Argument
file.delete
Test.specify "should fail when appending and matching columns by name but headers are disabled (headers=False)" <|
@ -311,7 +311,7 @@ spec =
file.delete_if_exists
no_header_format = Delimited "," . without_headers
existing_table.write file on_existing_file=Existing_File_Behavior.Overwrite
appending_table.write file no_header_format on_existing_file=Existing_File_Behavior.Append . should_fail_with Illegal_Argument.Error
appending_table.write file no_header_format on_existing_file=Existing_File_Behavior.Append . should_fail_with Illegal_Argument
file.delete
Test.specify "should fail on column mismatch when appending to a file by name" <|
@ -321,7 +321,7 @@ spec =
file.delete_if_exists
existing_table.write file on_existing_file=Existing_File_Behavior.Overwrite
result = appending_table.write file on_existing_file=Existing_File_Behavior.Append
result . should_fail_with Column_Name_Mismatch.Error
result . should_fail_with Column_Name_Mismatch
result.catch.missing . should_equal ["A"]
result.catch.extras . should_equal ["X"]
result.catch.to_display_text . should_equal "Columns mismatch. Missing from new data: [A] Extras in new data: [X]"
@ -362,13 +362,13 @@ spec =
existing_table.write file on_existing_file=Existing_File_Behavior.Overwrite
result_1 = appending_table_1.write file match_columns=Match_Columns.By_Position on_existing_file=Existing_File_Behavior.Append
result_1 . should_fail_with Column_Count_Mismatch.Error
result_1 . should_fail_with Column_Count_Mismatch
result_1.catch.expected . should_equal 3
result_1.catch.actual . should_equal 2
result_1.catch.to_display_text . should_equal "Expected 3 columns, got 2."
result_2 = appending_table_2.write file match_columns=Match_Columns.By_Position on_existing_file=Existing_File_Behavior.Append
result_2 . should_fail_with Column_Count_Mismatch.Error
result_2 . should_fail_with Column_Count_Mismatch
result_2.catch.expected . should_equal 3
result_2.catch.actual . should_equal 4
result_2.catch.to_display_text . should_equal "Expected 3 columns, got 4."
@ -544,7 +544,7 @@ spec =
file.delete_if_exists
initial_table.write file (Delimited ',' line_endings=Line_Ending_Style.Mac_Legacy)
result = table_to_append.write file (Delimited ',' line_endings=Line_Ending_Style.Unix) on_existing_file=Existing_File_Behavior.Append match_columns=Match_Columns.By_Position
result . should_fail_with Illegal_Argument.Error
result . should_fail_with Illegal_Argument
result.catch.message . should_equal "The explicitly provided line endings ('\n') do not match the line endings in the file ('\r')."
file.delete
@ -559,7 +559,8 @@ spec =
t1 = Table.new [["X", [1, 2, 3]]]
[Existing_File_Behavior.Backup, Existing_File_Behavior.Overwrite, Existing_File_Behavior.Append].each behavior->
r1 = t1.write f (Delimited ',') on_existing_file=behavior
r1.should_fail_with File_Error.Access_Denied
r1.should_fail_with File_Error
r1.catch.should_be_a File_Error.Access_Denied
f.read Plain_Text . should_equal initial_data
set_writable f True
@ -572,7 +573,8 @@ spec =
f = parent / "foo.csv"
t1 = Table.new [["X", [1, 2, 3]]]
r1 = t1.write f (Delimited ',')
r1.should_fail_with File_Error.Not_Found
r1.should_fail_with File_Error
r1.catch.should_be_a File_Error.Not_Found
Test.specify "should warn about not-encodable characters according to the problem behaviour" <|
f = enso_project.data / "transient" / "encoding-errors.csv"

View File

@ -157,25 +157,25 @@ spec_write suffix test_sheet_name =
Test.specify 'should result in Invalid_Location error if trying to write in a bad location' <|
out.delete_if_exists
(enso_project.data / test_sheet_name) . copy_to out
sub_clothes.write out (Excel (Cell_Range "DoesNotExist!A1")) . should_fail_with Invalid_Location.Error
sub_clothes.write out (Excel (Cell_Range "DoesNotExist!A1:B2")) . should_fail_with Invalid_Location.Error
sub_clothes.write out (Excel (Cell_Range "SillyRangeName")) . should_fail_with Invalid_Location.Error
sub_clothes.write out (Excel (Cell_Range "DoesNotExist!A1")) . should_fail_with Invalid_Location
sub_clothes.write out (Excel (Cell_Range "DoesNotExist!A1:B2")) . should_fail_with Invalid_Location
sub_clothes.write out (Excel (Cell_Range "SillyRangeName")) . should_fail_with Invalid_Location
out.delete_if_exists
Test.specify 'should result in Range_Exceeded error if trying to write in too small a range' <|
out.delete_if_exists
(enso_project.data / test_sheet_name) . copy_to out
sub_clothes.write out (Excel (Cell_Range "Another!A1:B2")) . should_fail_with Range_Exceeded.Error
sub_clothes.write out (Excel (Cell_Range "Another!A1:B2")) . should_fail_with Range_Exceeded
out.delete_if_exists
Test.specify 'should result in Existing_Data error if in Error mode and trying to replace' <|
out.delete_if_exists
(enso_project.data / test_sheet_name) . copy_to out
lmd = out.last_modified_time
sub_clothes.write out (Excel (Worksheet 1)) on_existing_file=Existing_File_Behavior.Error . should_fail_with Existing_Data.Error
sub_clothes.write out (Excel (Worksheet "Another")) on_existing_file=Existing_File_Behavior.Error . should_fail_with Existing_Data.Error
sub_clothes.write out (Excel (Cell_Range "Another!A1")) on_existing_file=Existing_File_Behavior.Error . should_fail_with Existing_Data.Error
sub_clothes.write out (Excel (Cell_Range "Sheet1!A9")) on_existing_file=Existing_File_Behavior.Error . should_fail_with Existing_Data.Error
sub_clothes.write out (Excel (Worksheet 1)) on_existing_file=Existing_File_Behavior.Error . should_fail_with Existing_Data
sub_clothes.write out (Excel (Worksheet "Another")) on_existing_file=Existing_File_Behavior.Error . should_fail_with Existing_Data
sub_clothes.write out (Excel (Cell_Range "Another!A1")) on_existing_file=Existing_File_Behavior.Error . should_fail_with Existing_Data
sub_clothes.write out (Excel (Cell_Range "Sheet1!A9")) on_existing_file=Existing_File_Behavior.Error . should_fail_with Existing_Data
out.last_modified_time.should_equal lmd
out.delete_if_exists
@ -183,7 +183,9 @@ spec_write suffix test_sheet_name =
out.delete_if_exists
(enso_project.data / test_sheet_name) . copy_to out
lmd = out.last_modified_time
sub_clothes.write out (Excel (Worksheet "Testing")) on_existing_file=Existing_File_Behavior.Error . should_fail_with File_Error.Already_Exists
result = sub_clothes.write out (Excel (Worksheet "Testing")) on_existing_file=Existing_File_Behavior.Error
result.should_fail_with File_Error
result.catch.should_be_a File_Error.Already_Exists
out.last_modified_time.should_equal lmd
out.delete_if_exists
@ -320,7 +322,7 @@ spec_write suffix test_sheet_name =
out.delete_if_exists
(enso_project.data / test_sheet_name) . copy_to out
extra_another = Table.new [['CC',[True, False]], ['BB',[4, 5]], ['AA', ['d', 'e']]]
extra_another.write out (Excel (Worksheet "Another")) on_existing_file=Existing_File_Behavior.Append . should_fail_with Column_Name_Mismatch.Error
extra_another.write out (Excel (Worksheet "Another")) on_existing_file=Existing_File_Behavior.Append . should_fail_with Column_Name_Mismatch
out.delete_if_exists
Test.specify 'should fail to append to a sheet by name if extra columns' <|
@ -328,7 +330,7 @@ spec_write suffix test_sheet_name =
(enso_project.data / test_sheet_name) . copy_to out
lmd = out.last_modified_time
extra_another = Table.new [['CC',[True, False]], ['BB',[4, 5]], ['AA', ['d', 'e']], ['DD', ['2022-01-20', '2022-01-21']], ['EE', ['2022-01-20', '2022-01-21']]]
extra_another.write out (Excel (Worksheet "Another")) on_existing_file=Existing_File_Behavior.Append . should_fail_with Column_Name_Mismatch.Error
extra_another.write out (Excel (Worksheet "Another")) on_existing_file=Existing_File_Behavior.Append . should_fail_with Column_Name_Mismatch
out.last_modified_time.should_equal lmd
out.delete_if_exists
@ -337,8 +339,8 @@ spec_write suffix test_sheet_name =
(enso_project.data / test_sheet_name) . copy_to out
lmd = out.last_modified_time
extra_another = Table.new [['CC',[True, False]], ['BB',[4, 5]], ['AA', ['d', 'e']], ['DD', ['2022-01-20', '2022-01-21']], ['EE', ['2022-01-20', '2022-01-21']]]
extra_another.write out (Excel (Worksheet "NoHeaders")) on_existing_file=Existing_File_Behavior.Append . should_fail_with Illegal_Argument.Error
extra_another.write out (Excel (Worksheet "Another") False) on_existing_file=Existing_File_Behavior.Append . should_fail_with Illegal_Argument.Error
extra_another.write out (Excel (Worksheet "NoHeaders")) on_existing_file=Existing_File_Behavior.Append . should_fail_with Illegal_Argument
extra_another.write out (Excel (Worksheet "Another") False) on_existing_file=Existing_File_Behavior.Append . should_fail_with Illegal_Argument
out.last_modified_time.should_equal lmd
out.delete_if_exists
@ -347,7 +349,7 @@ spec_write suffix test_sheet_name =
(enso_project.data / test_sheet_name) . copy_to out
lmd = out.last_modified_time
extra_another = Table.new [['CC',[True, False]], ['BB',[4, 5]], ['AA', ['d', 'e']]]
extra_another.write out (Excel (Worksheet "Another")) on_existing_file=Existing_File_Behavior.Append match_columns=Match_Columns.By_Position . should_fail_with Column_Count_Mismatch.Error
extra_another.write out (Excel (Worksheet "Another")) on_existing_file=Existing_File_Behavior.Append match_columns=Match_Columns.By_Position . should_fail_with Column_Count_Mismatch
out.last_modified_time.should_equal lmd
out.delete_if_exists
@ -356,7 +358,7 @@ spec_write suffix test_sheet_name =
(enso_project.data / test_sheet_name) . copy_to out
lmd = out.last_modified_time
extra_another = Table.new [['CC',[True, False]], ['BB',[4, 5]], ['AA', ['d', 'e']], ['DD', ['2022-01-20', '2022-01-21']], ['EE', ['2022-01-20', '2022-01-21']]]
extra_another.write out (Excel (Worksheet "Another")) on_existing_file=Existing_File_Behavior.Append match_columns=Match_Columns.By_Position . should_fail_with Column_Count_Mismatch.Error
extra_another.write out (Excel (Worksheet "Another")) on_existing_file=Existing_File_Behavior.Append match_columns=Match_Columns.By_Position . should_fail_with Column_Count_Mismatch
out.last_modified_time.should_equal lmd
out.delete_if_exists
@ -365,7 +367,7 @@ spec_write suffix test_sheet_name =
(enso_project.data / test_sheet_name) . copy_to out
lmd = out.last_modified_time
extra_another = Table.new [['AA', ['d', 'e']], ['BB',[4, 5]], ['CC',[True, False]], ['DD', ['2022-01-20', '2022-01-21']]]
extra_another.write out (Excel (Cell_Range "Another!A1:D5")) on_existing_file=Existing_File_Behavior.Append . should_fail_with Range_Exceeded.Error
extra_another.write out (Excel (Cell_Range "Another!A1:D5")) on_existing_file=Existing_File_Behavior.Append . should_fail_with Range_Exceeded
out.last_modified_time.should_equal lmd
out.delete_if_exists
@ -374,23 +376,25 @@ spec_write suffix test_sheet_name =
(enso_project.data / test_sheet_name) . copy_to out
lmd = out.last_modified_time
extra_another = Table.new [['AA', ['d', 'e']], ['BB',[4, 5]], ['CC',[True, False]], ['DD', ['2022-01-20', '2022-01-21']]]
extra_another.write out (Excel (Cell_Range "Random!B3")) on_existing_file=Existing_File_Behavior.Append . should_fail_with Existing_Data.Error
extra_another.write out (Excel (Cell_Range "Random!B3")) on_existing_file=Existing_File_Behavior.Append . should_fail_with Existing_Data
out.last_modified_time.should_equal lmd
out.delete_if_exists
Test.specify "should fail if the target file is read-only" <|
f = enso_project.data / "transient" / "permission."+suffix
if f.exists then Util.set_writable f True
f.delete_if_exists
initial_data = "MY DATA"
initial_data = Table.new [["Y", [10, 20, 30]]]
initial_data.write f
Util.set_writable f False
t1 = Table.new [["X", [1, 2, 3]]]
[Existing_File_Behavior.Backup, Existing_File_Behavior.Overwrite, Existing_File_Behavior.Append].each behavior->
r1 = t1.write f (Excel (Worksheet "Another")) on_existing_file=behavior
r1.should_fail_with File_Error.Access_Denied
f.read Plain_Text . should_equal initial_data
r1.should_fail_with File_Error
r1.catch.should_be_a File_Error.Access_Denied
f.read . read "EnsoSheet" . should_equal initial_data
Util.set_writable f True
f.delete
@ -402,7 +406,8 @@ spec_write suffix test_sheet_name =
f = parent / "foo."+suffix
t1 = Table.new [["X", [1, 2, 3]]]
r1 = t1.write f (Excel (Worksheet "Another"))
r1.should_fail_with File_Error.Not_Found
r1.should_fail_with File_Error
r1.catch.should_be_a File_Error.Not_Found
Test.specify "should allow to write and read-back Unicode characters" <|
encodings = enso_project.data / "transient" / "encodings."+suffix
@ -445,66 +450,66 @@ spec =
check_range (Excel_Range.from_address "Test!R1C1:R5C3") 'Test' [1, 1, 5, 3]
Test.specify 'should fail gracefully for invalid patterns' <|
Excel_Range.from_address "Test!$$QA1" . should_fail_with Illegal_Argument.Error
Excel_Range.from_address "Test!BADADDRESS" . should_fail_with Illegal_Argument.Error
Excel_Range.from_address "Test!$$QA1" . should_fail_with Illegal_Argument
Excel_Range.from_address "Test!BADADDRESS" . should_fail_with Illegal_Argument
Test.specify 'should allow Range creation for a cell' <|
check_range (Excel_Range.for_cell "Hello World" 123 14) 'Hello World' [14, 123, 14, 123] True
check_range (Excel_Range.for_cell "Hello World" "DS" 14) 'Hello World' [14, 123, 14, 123] True
Excel_Range.for_cell "Test" 123 14 . address . should_equal "Test!DS14"
Excel_Range.for_cell "Hello World" 123 14 . address . should_equal "'Hello World'!DS14"
Excel_Range.for_cell "Test" 20000 1 . should_fail_with Illegal_Argument.Error
Excel_Range.for_cell "Test" "ZZZ" 1 . should_fail_with Illegal_Argument.Error
Excel_Range.for_cell "Test" 0 1 . should_fail_with Illegal_Argument.Error
Excel_Range.for_cell "Test" 1 10000000 . should_fail_with Illegal_Argument.Error
Excel_Range.for_cell "Test" 1 0 . should_fail_with Illegal_Argument.Error
Excel_Range.for_cell "Test" 20000 1 . should_fail_with Illegal_Argument
Excel_Range.for_cell "Test" "ZZZ" 1 . should_fail_with Illegal_Argument
Excel_Range.for_cell "Test" 0 1 . should_fail_with Illegal_Argument
Excel_Range.for_cell "Test" 1 10000000 . should_fail_with Illegal_Argument
Excel_Range.for_cell "Test" 1 0 . should_fail_with Illegal_Argument
Test.specify 'should allow Range creation for a range' <|
check_range (Excel_Range.for_range "Hello World" 55 120 123 14) 'Hello World' [14, 55, 120, 123]
check_range (Excel_Range.for_range "Hello World" "BC" 120 "DS" 14) 'Hello World' [14, 55, 120, 123]
Excel_Range.for_range "Test" 55 120 123 14 . address . should_equal "Test!BC14:DS120"
Excel_Range.for_range "Hello World" 55 120 123 14 . address . should_equal "'Hello World'!BC14:DS120"
Excel_Range.for_range "Test" 20000 1 123 14 . should_fail_with Illegal_Argument.Error
Excel_Range.for_range "Test" "ZZZ" 1 123 14 . should_fail_with Illegal_Argument.Error
Excel_Range.for_range "Test" 0 1 123 14 . should_fail_with Illegal_Argument.Error
Excel_Range.for_range "Test" 5 1 20000 14 . should_fail_with Illegal_Argument.Error
Excel_Range.for_range "Test" 5 1 0 14 . should_fail_with Illegal_Argument.Error
Excel_Range.for_range "Test" 5 0 123 14 . should_fail_with Illegal_Argument.Error
Excel_Range.for_range "Test" 5 10000000 123 14 . should_fail_with Illegal_Argument.Error
Excel_Range.for_range "Test" 5 1 123 0 . should_fail_with Illegal_Argument.Error
Excel_Range.for_range "Test" 5 1 123 10000000 . should_fail_with Illegal_Argument.Error
Excel_Range.for_range "Test" 20000 1 123 14 . should_fail_with Illegal_Argument
Excel_Range.for_range "Test" "ZZZ" 1 123 14 . should_fail_with Illegal_Argument
Excel_Range.for_range "Test" 0 1 123 14 . should_fail_with Illegal_Argument
Excel_Range.for_range "Test" 5 1 20000 14 . should_fail_with Illegal_Argument
Excel_Range.for_range "Test" 5 1 0 14 . should_fail_with Illegal_Argument
Excel_Range.for_range "Test" 5 0 123 14 . should_fail_with Illegal_Argument
Excel_Range.for_range "Test" 5 10000000 123 14 . should_fail_with Illegal_Argument
Excel_Range.for_range "Test" 5 1 123 0 . should_fail_with Illegal_Argument
Excel_Range.for_range "Test" 5 1 123 10000000 . should_fail_with Illegal_Argument
Test.specify 'should allow Range creation for a column' <|
check_range (Excel_Range.for_columns "Hello World" 123) 'Hello World' [Nothing, 123, Nothing, 123]
check_range (Excel_Range.for_columns "Hello World" "DS") 'Hello World' [Nothing, 123, Nothing, 123]
Excel_Range.for_columns "Test" 123 . address . should_equal "Test!DS"
Excel_Range.for_columns "Hello World" 123 . address . should_equal "'Hello World'!DS"
Excel_Range.for_columns "Test" 20000 . should_fail_with Illegal_Argument.Error
Excel_Range.for_columns "Test" "ZZZ" . should_fail_with Illegal_Argument.Error
Excel_Range.for_columns "Test" 0 . should_fail_with Illegal_Argument.Error
Excel_Range.for_columns "Test" 20000 . should_fail_with Illegal_Argument
Excel_Range.for_columns "Test" "ZZZ" . should_fail_with Illegal_Argument
Excel_Range.for_columns "Test" 0 . should_fail_with Illegal_Argument
Test.specify 'should allow Range creation for columns' <|
check_range (Excel_Range.for_columns "Hello World" "BC" 123) 'Hello World' [Nothing, 55, Nothing, 123]
check_range (Excel_Range.for_columns "Hello World" 55 "DS") 'Hello World' [Nothing, 55, Nothing, 123]
Excel_Range.for_columns "Test" 55 123 . address . should_equal "Test!BC:DS"
Excel_Range.for_columns "Hello World" "BC" "DS" . address . should_equal "'Hello World'!BC:DS"
Excel_Range.for_columns "Test" 55 20000 . should_fail_with Illegal_Argument.Error
Excel_Range.for_columns "Test" 55 "ZZZ" . should_fail_with Illegal_Argument.Error
Excel_Range.for_columns "Test" 55 0 . should_fail_with Illegal_Argument.Error
Excel_Range.for_columns "Test" 55 20000 . should_fail_with Illegal_Argument
Excel_Range.for_columns "Test" 55 "ZZZ" . should_fail_with Illegal_Argument
Excel_Range.for_columns "Test" 55 0 . should_fail_with Illegal_Argument
Test.specify 'should allow Range creation for a row' <|
check_range (Excel_Range.for_rows "Hello World" 123) 'Hello World' [123, Nothing, 123, Nothing]
Excel_Range.for_rows "Test" 123 . address . should_equal "Test!123"
Excel_Range.for_rows "Hello World" 123 . address . should_equal "'Hello World'!123"
Excel_Range.for_rows "Test" 20000000 . should_fail_with Illegal_Argument.Error
Excel_Range.for_rows "Test" 0 . should_fail_with Illegal_Argument.Error
Excel_Range.for_rows "Test" 20000000 . should_fail_with Illegal_Argument
Excel_Range.for_rows "Test" 0 . should_fail_with Illegal_Argument
Test.specify 'should allow Range creation for rows' <|
check_range (Excel_Range.for_rows "Hello World" 55 123) 'Hello World' [55, Nothing, 123, Nothing]
Excel_Range.for_rows "Test" 55 123 . address . should_equal "Test!55:123"
Excel_Range.for_rows "Hello World" 55 123 . address . should_equal "'Hello World'!55:123"
Excel_Range.for_rows "Test" 55 20000000 . should_fail_with Illegal_Argument.Error
Excel_Range.for_rows "Test" 55 0 . should_fail_with Illegal_Argument.Error
Excel_Range.for_rows "Test" 55 20000000 . should_fail_with Illegal_Argument
Excel_Range.for_rows "Test" 55 0 . should_fail_with Illegal_Argument
xlsx_sheet = enso_project.data / "TestSheet.xlsx"
xlsx_path = xlsx_sheet.path
@ -660,25 +665,39 @@ spec =
Test.group "Problems" <|
Test.specify "should handle non-existing file gracefully" <|
bad_file = enso_project.data / "DoesNotExists.xlsx"
bad_file.read (Excel (Cell_Range "Sheet1!A:C")) . should_fail_with File_Error.Not_Found
result = bad_file.read (Excel (Cell_Range "Sheet1!A:C"))
result.should_fail_with File_Error
result.catch.should_be_a File_Error.Not_Found
Test.specify "should handle wrong xls_format gracefully" <|
xlsx_sheet.read (Excel (Cell_Range "Sheet1!A:C") xls_format=True) . should_fail_with File_Error.IO_Error
xls_sheet.read (Excel (Cell_Range "Sheet1!A:C") xls_format=False) . should_fail_with File_Error.IO_Error
r1 = xlsx_sheet.read (Excel (Cell_Range "Sheet1!A:C") xls_format=True)
r1.should_fail_with File_Error
r1.catch.should_be_a File_Error.Corrupted_Format
r2 = xls_sheet.read (Excel (Cell_Range "Sheet1!A:C") xls_format=False)
r2.should_fail_with File_Error
r2.catch.should_be_a File_Error.Corrupted_Format
Test.specify "should handle malformed XLS files gracefully" <|
bad_file = enso_project.data / "transient" / "malformed.xls"
"not really an XLS file contents...".write bad_file on_existing_file=Existing_File_Behavior.Overwrite
r1 = bad_file.read
r1.should_fail_with File_Error.Corrupted_Format
r1.should_fail_with File_Error
r1.catch.should_be_a File_Error.Corrupted_Format
r1.catch.to_display_text.should_contain "is corrupted"
bad_file.read Excel . should_fail_with File_Error.Corrupted_Format
bad_file.read (Excel Sheet_Names) . should_fail_with File_Error.Corrupted_Format
r1a = bad_file.read Excel
r1a.should_fail_with File_Error
r1a.catch.should_be_a File_Error.Corrupted_Format
r1b = bad_file.read (Excel Sheet_Names)
r1b.should_fail_with File_Error
r1b.catch.should_be_a File_Error.Corrupted_Format
r2 = bad_file.read (Excel (Cell_Range "Sheet1!A:C"))
r2.should_fail_with File_Error.Corrupted_Format
r2.should_fail_with File_Error
r2.catch.should_be_a File_Error.Corrupted_Format
r2.catch.to_display_text.should_contain "is corrupted"
bad_file.delete

View File

@ -32,7 +32,8 @@ spec = Test.group 'Various File Format support on Table' <|
f1 = (transient / "test4.unknown-format")
f1.delete_if_exists
r1 = t1.write f1
r1.should_fail_with File_Error.Unsupported_Output_Type
r1.should_fail_with File_Error
r1.catch.should_be_a File_Error.Unsupported_Output_Type
r1.catch.format . should_equal f1
r1.catch.to_display_text . should_equal "Values of type Table cannot be written as format test4.unknown-format."
@ -40,7 +41,8 @@ spec = Test.group 'Various File Format support on Table' <|
f2.delete_if_exists
my_format = Plain_Text Encoding.ascii
r2 = t1.write f2 my_format
r2.should_fail_with File_Error.Unsupported_Output_Type
r2.should_fail_with File_Error
r2.catch.should_be_a File_Error.Unsupported_Output_Type
r2.catch.format . should_equal my_format
main = Test_Suite.run_main spec

View File

@ -31,8 +31,8 @@ spec = Test.group "Columns" <|
test_column.at 0 . should_equal 1
test_column.at 2 . should_equal 5
test_column.at 5 . should_equal 6
test_column.at 6 . should_fail_with Index_Out_Of_Bounds.Error
empty_column.at 0 . should_fail_with Index_Out_Of_Bounds.Error
test_column.at 6 . should_fail_with Index_Out_Of_Bounds
empty_column.at 0 . should_fail_with Index_Out_Of_Bounds
Test.specify "should be able to take the first n elements" <|
expected_1 = Column.from_vector "Test" [1, 3, 5]
@ -60,11 +60,11 @@ spec = Test.group "Columns" <|
Test.specify "should be able to get the first element" <|
test_column.first . should_equal 1
empty_column.first.should_fail_with Index_Out_Of_Bounds.Error
empty_column.first.should_fail_with Index_Out_Of_Bounds
Test.specify "should be able to get the last element" <|
test_column.last . should_equal 6
empty_column.last.should_fail_with Index_Out_Of_Bounds.Error
empty_column.last.should_fail_with Index_Out_Of_Bounds
Test.specify "should be able to be reversed" <|
expected_1 = Column.from_vector "Test" [6, 4, 2, 5, 3, 1]

View File

@ -86,14 +86,14 @@ spec =
r2.at "bar" . to_vector . should_equal []
Test.specify "should handle error scenarios gracefully" <|
Table.new [["X", [1,2,3]], ["Y", [4]]] . should_fail_with Illegal_Argument.Error
Table.new [["X", [1]], ["X", [2]]] . should_fail_with Illegal_Argument.Error
Table.new [] . should_fail_with Illegal_Argument.Error
Table.new [["X", [1,2,3]], ["Y", [4]]] . should_fail_with Illegal_Argument
Table.new [["X", [1]], ["X", [2]]] . should_fail_with Illegal_Argument
Table.new [] . should_fail_with Illegal_Argument
Table.from_rows ["X", "X"] [] . should_fail_with Illegal_Argument.Error
Table.from_rows ["X", "Y"] [[1,2], [1]] . should_fail_with Index_Out_Of_Bounds.Error
Table.from_rows [] [] . should_fail_with Illegal_Argument.Error
Table.from_rows [] [[]] . should_fail_with Illegal_Argument.Error
Table.from_rows ["X", "X"] [] . should_fail_with Illegal_Argument
Table.from_rows ["X", "Y"] [[1,2], [1]] . should_fail_with Index_Out_Of_Bounds
Table.from_rows [] [] . should_fail_with Illegal_Argument
Table.from_rows [] [[]] . should_fail_with Illegal_Argument
Test.specify "should be internally guarded against creating a table without columns" <|
Test.expect_panic_with (Java_Table.new []) IllegalArgumentException
@ -153,7 +153,7 @@ spec =
t.at 's\u0301ciana' . to_vector . should_equal [1, 2, 3]
t.at 'cafe\u0301' . to_vector . should_equal [4, 5, 6]
t.at 'café' . to_vector . should_equal [4, 5, 6]
t.at 'sciana' . should_fail_with No_Such_Column.Error
t.at 'sciana' . should_fail_with No_Such_Column
Test.group "Vector conversion" <|
Test.specify "should allow converting columns to valid vectors" <|
@ -448,7 +448,7 @@ spec =
r5.at 'ints' . to_vector . should_equal [2, 3, 4, 5, 1]
r6 = df.order_by (['mixed_dates'])
r6 . should_fail_with Incomparable_Values.Error
r6 . should_fail_with Incomparable_Values
Test.group "Sorting Columns" <|
Test.specify 'should sort columns with specified ordering and missing placement' <|
@ -751,7 +751,7 @@ spec =
Test.specify "until hashing is supported, should throw an error when trying to aggregate a custom object" <|
t = Table.new [["X", [My.Data 1 2, My.Data 3 4, My.Data 1 2]]]
t.distinct . should_fail_with Illegal_Argument.Error
t.distinct . should_fail_with Illegal_Argument
Test.group "[In-Memory] Table.filter" <|
Test.specify "by a custom predicate" <|
@ -908,13 +908,13 @@ spec =
Test.group "[In-Memory-specific] Table.join" <|
Test.specify "should correctly report unsupported cross-backend joins" <|
t = Table.new [["X", [1, 2, 3]]]
t.join 42 . should_fail_with Type_Error.Error
t.join 42 . should_fail_with Type_Error
db = Database.connect (SQLite In_Memory)
db_table = db.upload_table "test" (Table.new [["Y", [4, 5, 6]]])
r = t.join db_table
r.should_fail_with Illegal_Argument.Error
r.should_fail_with Illegal_Argument
r.catch.message . contains "cross-backend" . should_be_true
main = Test_Suite.run_main spec

View File

@ -7,7 +7,7 @@ import Standard.Test.Extensions
spec =
Test.group "JavaScript Objects, Arrays & Functions" <|
Test.specify "Missing method" <|
Test.expect_panic_with data.missing No_Such_Method.Error
Test.expect_panic_with data.missing No_Such_Method
Test.specify "Found method" <|
data.classes

View File

@ -21,7 +21,7 @@ spec =
arr.at 0 . should_equal 10
arr.at 1 . should_equal 11
arr.at 2 . should_equal 12
arr.at 3 . should_fail_with Index_Out_Of_Bounds.Error
arr.at 3 . should_fail_with Index_Out_Of_Bounds
Test.specify "should be able to be used to construct a Vector" <|
v1 = Vector.from_polyglot_array (Array_Proxy.new 3 (ix -> ix + 10))
@ -42,8 +42,8 @@ spec =
v2.should_equal [0, 10, 20, 30, 40]
Test.specify "should check validity at construction" <|
Test.expect_panic_with (Array_Proxy.new 0 0) Type_Error.Error
Test.expect_panic_with (Array_Proxy.new -1 (x->x)) Illegal_Argument.Error
Test.expect_panic_with (Array_Proxy.new 0 0) Type_Error
Test.expect_panic_with (Array_Proxy.new -1 (x->x)) Illegal_Argument
Test.specify "should pretend to just be an Array" <|
proxy = Array_Proxy.new 3 (ix -> ix + 10)

View File

@ -23,8 +23,8 @@ test_arrays array_from_vector =
Test.specify "should panic on out of bounds access" <|
arr = array_from_vector [1, 2, 3]
(arr.at -4) . should_fail_with Index_Out_Of_Bounds.Error
(arr.at 3) . should_fail_with Index_Out_Of_Bounds.Error
(arr.at -4) . should_fail_with Index_Out_Of_Bounds
(arr.at 3) . should_fail_with Index_Out_Of_Bounds
spec =
Test.group "Enso Arrays" <|
@ -41,7 +41,7 @@ spec =
Test.specify "should propagate dataflow errors" <|
err = Error.throw (Illegal_State.Error "Foo")
res = Array.new err
res . should_fail_with Illegal_State.Error
res . should_fail_with Illegal_State
Test.specify "should not sort in place" <|
arr = make_enso_array [3, 1, 2]

View File

@ -37,7 +37,7 @@ spec =
Test.specify "should short-circuit ||" <|
(1 == 1) || (crash) . should_equal True
(1 == 0) || (1 == 1) . should_equal True
(1 == 0) || (crash) . should_fail_with My_Error.Value
(1 == 0) || (crash) . should_fail_with My_Error
(1 == 1) || "foo" . should_equal True
(1 == 0) || "foo" . should_equal "foo"
@ -45,7 +45,7 @@ spec =
(1 == 0) && (crash) . should_equal False
(1 == 1) && (1 == 0) . should_equal False
(1 == 1) && (1 == 1) . should_equal True
(1 == 1) && (crash) . should_fail_with My_Error.Value
(1 == 1) && (crash) . should_fail_with My_Error
(1 == 0) && "foo" . should_equal False
(1 == 1) && "foo" . should_equal "foo"

View File

@ -121,7 +121,7 @@ spec =
object.get "bar" . should_equal Nothing
object.get "bar" 1 . should_equal 1
object.at "foo" . should_equal "bar"
object.at "bar" . should_fail_with No_Such_Key.Error
object.at "bar" . should_fail_with No_Such_Key
Json.parse "null" . get "foo" . should_equal Nothing
Json.parse "null" . get "foo" 1 . should_equal 1
@ -132,7 +132,7 @@ spec =
Test.specify "should be able to get a value by index" <|
Json.parse "[1, 2, 3, 4, 5]" . at 2 . should_equal 3
Json.parse "[1, 2, 3, 4, 5]" . at -2 . should_equal 4
Json.parse "[1, 2, 3, 4, 5]" . at 5 . should_fail_with Index_Out_Of_Bounds.Error
Json.parse "[1, 2, 3, 4, 5]" . at 5 . should_fail_with Index_Out_Of_Bounds
Json.parse "[1, 2, 3, 4, 5]" . get 2 . should_equal 3
Json.parse "[1, 2, 3, 4, 5]" . get -2 . should_equal 4
Json.parse "[1, 2, 3, 4, 5]" . get 5 . should_equal Nothing

View File

@ -47,7 +47,7 @@ spec = Test.group "List" <|
l.find (==2) start=3 . should_fail_with Not_Found
l.find (==2) start=-1 . should_fail_with Not_Found
l.find (==2) start=-2 . should_equal 2
l.find (==2) start=4 . should_fail_with Index_Out_Of_Bounds.Error
l.find (==2) start=4 . should_fail_with Index_Out_Of_Bounds
l.find (==2) start=4 . catch . should_equal (Index_Out_Of_Bounds.Error 4 4)
empty.find (==1) . should_fail_with Not_Found
empty.find (==1) if_missing=Nothing . should_equal Nothing
@ -61,11 +61,11 @@ spec = Test.group "List" <|
l.index_of 2 start=3 . should_equal Nothing
l.index_of 2 start=-1 . should_equal Nothing
l.index_of (==2) start=-2 . should_equal 1
l.index_of 2 start=4 . should_fail_with Index_Out_Of_Bounds.Error
l.index_of 2 start=4 . should_fail_with Index_Out_Of_Bounds
l.index_of 2 start=4 . catch . should_equal (Index_Out_Of_Bounds.Error 4 4)
l.index_of 2 start=-3 . should_equal 1
l.index_of 2 start=-4 . should_fail_with Index_Out_Of_Bounds.Error
l.index_of 2 start=-4 . should_fail_with Index_Out_Of_Bounds.Error
l.index_of 2 start=-4 . should_fail_with Index_Out_Of_Bounds
l.index_of 2 start=-4 . should_fail_with Index_Out_Of_Bounds
Test.specify "should allow finding the last index of an element in the list with `.last_index_of`" <|
ll = List.Cons 1 <| List.Cons 2 <| List.Cons 3 <| List.Cons 1 <| List.Cons 2 <| List.Cons 3 <| List.Nil
ll.last_index_of (==2) . should_equal 4
@ -75,11 +75,11 @@ spec = Test.group "List" <|
empty.last_index_of (==1) . should_equal Nothing
ll.last_index_of 3 start=1 . should_equal Nothing
ll.last_index_of 3 start=5 . should_equal 5
ll.last_index_of 3 start=6 . should_fail_with Index_Out_Of_Bounds.Error
ll.last_index_of 3 start=6 . should_fail_with Index_Out_Of_Bounds
ll.last_index_of 3 start=6 . catch . should_equal (Index_Out_Of_Bounds.Error 6 6)
ll.last_index_of 2 start=-3 . should_equal 1
ll.last_index_of 2 start=-6 . should_equal Nothing
ll.last_index_of 3 start=-7 . should_fail_with Index_Out_Of_Bounds.Error
ll.last_index_of 3 start=-7 . should_fail_with Index_Out_Of_Bounds
ll.last_index_of (==2) start=-2 . should_equal 4
Test.specify "should allow checking if the list is empty with `.is_empty`" <|
l.is_empty . should_be_false
@ -103,7 +103,7 @@ spec = Test.group "List" <|
list.filter (Filter_Condition.Is_In [7, 3, 2]) . should_equal [2, 3].to_list
list.filter (Filter_Condition.Not_In [7, 3, 2]) . should_equal [1, 4, 5].to_list
Test.expect_panic_with (list.filter (Filter_Condition.Starts_With "a")) No_Such_Method.Error
Test.expect_panic_with (list.filter (Filter_Condition.Starts_With "a")) No_Such_Method
list.filter Filter_Condition.Is_True . should_equal List.Nil
list.filter Filter_Condition.Is_False . should_equal List.Nil
list.filter Filter_Condition.Is_Nothing . should_equal List.Nil
@ -131,7 +131,7 @@ spec = Test.group "List" <|
txt.filter (Filter_Condition.Less than="a") . should_equal List.Nil
txt.filter (Filter_Condition.Greater than="b") . should_equal ["bbb", "cccc", "baaa", "ś"].to_list
txt.filter (Filter_Condition.Between "b" "c") . should_equal ["bbb", "baaa"].to_list
Test.expect_panic_with (txt.filter (Filter_Condition.Starts_With 42)) Unsupported_Argument_Types.Error
Test.expect_panic_with (txt.filter (Filter_Condition.Starts_With 42)) Unsupported_Argument_Types
["", Nothing, " ", "a"].to_list.filter (Filter_Condition.Is_Empty) . should_equal ["", Nothing].to_list
["", Nothing, " ", "a"].to_list.filter (Filter_Condition.Not_Empty) . should_equal [" ", "a"].to_list
@ -166,30 +166,30 @@ spec = Test.group "List" <|
empty.take_start 2 . should_equal List.Nil
Test.specify "should allow getting the tail of the list with `.tail`" <|
l.tail . should_equal (List.Cons 2 (List.Cons 3 List.Nil))
empty.tail.should_fail_with Index_Out_Of_Bounds.Error
empty.tail.should_fail_with Index_Out_Of_Bounds
Test.specify "single element list.init yields Nil" <|
(List.Cons 1 List.Nil).init . should_equal List.Nil
Test.specify "two element list.init yields one element" <|
(List.Cons 1 (List.Cons 2 List.Nil)).init . should_equal (List.Cons 1 List.Nil)
Test.specify "should allow getting the init of the list with `.init`" <|
l.init . should_equal (List.Cons 1 (List.Cons 2 List.Nil))
empty.init.should_fail_with Index_Out_Of_Bounds.Error
empty.init.should_fail_with Index_Out_Of_Bounds
Test.specify "should allow getting the last element of the list with `.last`" <|
l.last . should_equal 3
empty.last.should_fail_with Index_Out_Of_Bounds.Error
empty.last.should_fail_with Index_Out_Of_Bounds
Test.specify "should allow getting the head of the list with `.first`" <|
l.first . should_equal 1
empty.first.should_fail_with Index_Out_Of_Bounds.Error
empty.first.should_fail_with Index_Out_Of_Bounds
empty.first.catch.should_equal (Index_Out_Of_Bounds.Error 0 0)
Test.specify "should allow getting the second item of the list with `.second`" <|
l.second . should_equal 2
empty.second.should_fail_with Index_Out_Of_Bounds.Error
empty.second.should_fail_with Index_Out_Of_Bounds
empty.second.catch.should_equal (Index_Out_Of_Bounds.Error 1 0)
(List.Cons 1 List.Nil).second.should_fail_with Index_Out_Of_Bounds.Error
(List.Cons 1 List.Nil).second.should_fail_with Index_Out_Of_Bounds
(List.Cons 1 List.Nil).second.catch.should_equal (Index_Out_Of_Bounds.Error 1 1)
Test.specify "should allow getting the last element of the list with `.last`" <|
l.last . should_equal 3
empty.last.should_fail_with Index_Out_Of_Bounds.Error
empty.last.should_fail_with Index_Out_Of_Bounds
empty.last.catch.should_equal (Index_Out_Of_Bounds.Error -1 0)
Test.specify "should allow getting the items of the list with `.at`" <|
l.at 0 . should_equal 1
@ -198,9 +198,9 @@ spec = Test.group "List" <|
l.at -3 . should_equal 1
l.at -2 . should_equal 2
l.at -1 . should_equal 3
empty.at 0 . should_fail_with Index_Out_Of_Bounds.Error
l.at 3 . should_fail_with Index_Out_Of_Bounds.Error
l.at -4 . should_fail_with Index_Out_Of_Bounds.Error
empty.at 0 . should_fail_with Index_Out_Of_Bounds
l.at 3 . should_fail_with Index_Out_Of_Bounds
l.at -4 . should_fail_with Index_Out_Of_Bounds
Test.specify "should allow getting the items of the list with `.get`" <|
l.get 0 . should_equal 1
l.get 1 . should_equal 2

View File

@ -220,7 +220,7 @@ spec =
m.at "foo" . should_equal 134
m.at "bar" . should_equal 654
m.at "baz" . should_equal "spam"
(m.at "nope").should_fail_with No_Such_Key.Error
(m.at "nope").should_fail_with No_Such_Key
Test.specify "should support get" <|
m = Map.empty . insert 2 3

View File

@ -12,7 +12,7 @@ spec =
gen = Generator
Test.specify "should not be invokable" <|
interval = Interval.inclusive 0 1
Test.expect_panic_with (gen.step 1 interval) Unimplemented.Error
Test.expect_panic_with (gen.step 1 interval) Unimplemented
Test.group "Deterministic Random Noise Generator" <|
gen = Deterministic_Random
Test.specify "should always return the same output for the same input" <|

View File

@ -62,7 +62,7 @@ spec =
Test.specify "should support integer division" <|
(10.div 3) . should_equal 3
(10.div 0).should_fail_with Arithmetic_Error.Error
(10.div 0).should_fail_with Arithmetic_Error
Test.specify "should support integral binary literals" <|
lit = 2_01101101
@ -120,28 +120,28 @@ spec =
positive_bits.bit_shift_l 64 . should_equal 16_6d0000000000000000
positive_bits.bit_shift_l -2 . should_equal 2_011011
positive_bits.bit_shift_l -64 . should_equal 0
(positive_bits.bit_shift_l positive_big_bits).should_fail_with Arithmetic_Error.Error
(positive_bits.bit_shift_l positive_big_bits).should_fail_with Arithmetic_Error
positive_bits.bit_shift_l negative_big_bits . should_equal 0
negative_bits.bit_shift_l 2 . should_equal -436
negative_bits.bit_shift_l 64 . should_equal -2010695104034341126144
negative_bits.bit_shift_l -2 . should_equal -28
negative_bits.bit_shift_l -64 . should_equal -1
(negative_bits.bit_shift_l positive_big_bits).should_fail_with Arithmetic_Error.Error
(negative_bits.bit_shift_l positive_big_bits).should_fail_with Arithmetic_Error
negative_bits.bit_shift_l negative_big_bits . should_equal -1
positive_big_bits.bit_shift_l 2 . should_equal 110680464442257309672
positive_big_bits.bit_shift_l 64 . should_equal 510423550381407695084381446705395007488
positive_big_bits.bit_shift_l -2 . should_equal 6917529027641081854
positive_big_bits.bit_shift_l -100 . should_equal 0
(positive_big_bits.bit_shift_l positive_big_bits).should_fail_with Arithmetic_Error.Error
(positive_big_bits.bit_shift_l positive_big_bits).should_fail_with Arithmetic_Error
positive_big_bits.bit_shift_l negative_big_bits . should_equal 0
negative_big_bits.bit_shift_l 2 . should_equal -110680464442257309672
negative_big_bits.bit_shift_l 64 . should_equal -510423550381407695084381446705395007488
negative_big_bits.bit_shift_l -2 . should_equal -6917529027641081855
negative_big_bits.bit_shift_l -100 . should_equal -1
(negative_big_bits.bit_shift_l positive_big_bits).should_fail_with Arithmetic_Error.Error
(negative_big_bits.bit_shift_l positive_big_bits).should_fail_with Arithmetic_Error
negative_big_bits.bit_shift_l negative_big_bits . should_equal -1
Test.specify "should support right bit shifts, preserving sign" <|
@ -154,28 +154,28 @@ spec =
positive_bits.bit_shift_r 64 . should_equal (positive_bits.bit_shift_l -64)
positive_bits.bit_shift_r -2 . should_equal (positive_bits.bit_shift_l 2)
positive_bits.bit_shift_r -64 . should_equal (positive_bits.bit_shift_l 64)
(positive_bits.bit_shift_r negative_big_bits).should_fail_with Arithmetic_Error.Error
(positive_bits.bit_shift_r negative_big_bits).should_fail_with Arithmetic_Error
positive_bits.bit_shift_r positive_big_bits . should_equal 0
negative_bits.bit_shift_r 2 . should_equal (negative_bits.bit_shift_l -2)
negative_bits.bit_shift_r 64 . should_equal (negative_bits.bit_shift_l -64)
negative_bits.bit_shift_r -2 . should_equal (negative_bits.bit_shift_l 2)
negative_bits.bit_shift_r -64 . should_equal (negative_bits.bit_shift_l 64)
(negative_bits.bit_shift_r negative_big_bits).should_fail_with Arithmetic_Error.Error
(negative_bits.bit_shift_r negative_big_bits).should_fail_with Arithmetic_Error
negative_bits.bit_shift_r positive_big_bits . should_equal -1
positive_big_bits.bit_shift_r 2 . should_equal (positive_big_bits.bit_shift_l -2)
positive_big_bits.bit_shift_r 64 . should_equal (positive_big_bits.bit_shift_l -64)
positive_big_bits.bit_shift_r -2 . should_equal (positive_big_bits.bit_shift_l 2)
positive_big_bits.bit_shift_r -100 . should_equal (positive_big_bits.bit_shift_l 100)
(positive_big_bits.bit_shift_r negative_big_bits).should_fail_with Arithmetic_Error.Error
(positive_big_bits.bit_shift_r negative_big_bits).should_fail_with Arithmetic_Error
positive_big_bits.bit_shift_r positive_big_bits . should_equal 0
negative_big_bits.bit_shift_r 2 . should_equal (negative_big_bits.bit_shift_l -2)
negative_big_bits.bit_shift_r 64 . should_equal (negative_big_bits.bit_shift_l -64)
negative_big_bits.bit_shift_r -2 . should_equal (negative_big_bits.bit_shift_l 2)
negative_big_bits.bit_shift_r -100 . should_equal (negative_big_bits.bit_shift_l 100)
(negative_big_bits.bit_shift_r negative_big_bits).should_fail_with Arithmetic_Error.Error
(negative_big_bits.bit_shift_r negative_big_bits).should_fail_with Arithmetic_Error
negative_big_bits.bit_shift_r positive_big_bits . should_equal -1
Test.specify "should be able to parse" <|
@ -184,9 +184,9 @@ spec =
Integer.parse "-1234567" . should_equal -1234567
Integer.parse "00000" . should_equal 0
Integer.parse "00000123" . should_equal 123
Integer.parse "123.45" . should_fail_with Number_Parse_Error.Error
Integer.parse "123A" . should_fail_with Number_Parse_Error.Error
Integer.parse "aaaa" . should_fail_with Number_Parse_Error.Error
Integer.parse "123.45" . should_fail_with Number_Parse_Error
Integer.parse "123A" . should_fail_with Number_Parse_Error
Integer.parse "aaaa" . should_fail_with Number_Parse_Error
Test.specify "should parse hundred factorial" <|
txt = hundred_factorial.to_text
@ -196,26 +196,26 @@ spec =
Test.specify "should fail on too huge decimal" <|
txt = hundred_factorial.to_text + ".345"
number = Integer.parse txt
number . should_fail_with Number_Parse_Error.Error
number . should_fail_with Number_Parse_Error
Test.specify "should be able to parse alternate bases" <|
Integer.parse "1245623" 8 . should_equal 347027
Integer.parse "-1245623" 8 . should_equal -347027
Integer.parse "0001245623" 8 . should_equal 347027
Integer.parse "00000" 8 . should_equal 0
Integer.parse "9847" 8 . should_fail_with Number_Parse_Error.Error
Integer.parse "8479" 8 . should_fail_with Number_Parse_Error.Error
Integer.parse "9847" 8 . should_fail_with Number_Parse_Error
Integer.parse "8479" 8 . should_fail_with Number_Parse_Error
Integer.parse "ABC123" 16 . should_equal 11256099
Integer.parse "123ABC" 16 . should_equal 1194684
Integer.parse "123aBc" 16 . should_equal 1194684
Integer.parse "-ABC123" 16 . should_equal -11256099
Integer.parse "00000ABC123" 16 . should_equal 11256099
Integer.parse "123aBcG" 16 . should_fail_with Number_Parse_Error.Error
Integer.parse "123aBcG" 16 . should_fail_with Number_Parse_Error
Integer.parse "10101010" 2 . should_equal 170
Integer.parse "00001111" 2 . should_equal 15
Integer.parse "-10101010" 2 . should_equal -170
Integer.parse "-101021010" 2 . should_fail_with Number_Parse_Error.Error
Integer.parse "123" 128 . should_fail_with Number_Parse_Error.Error
Integer.parse "-101021010" 2 . should_fail_with Number_Parse_Error
Integer.parse "123" 128 . should_fail_with Number_Parse_Error
Test.group "Decimals" <|
@ -231,7 +231,7 @@ spec =
Decimal.parse "-98.5" . should_equal -98.5
Decimal.parse "000000" . should_equal 0
Decimal.parse "000000.0001" . should_equal 0.0001
Decimal.parse "aaaa" . should_fail_with Number_Parse_Error.Error
Decimal.parse "aaaa" . should_fail_with Number_Parse_Error
Test.specify "parse with locale" <|
l = Locale.new "cs"
@ -240,7 +240,7 @@ spec =
Decimal.parse "-98,5" l . should_equal -98.5
Decimal.parse "000000" l . should_equal 0
Decimal.parse "000000,0001" l . should_equal 0.0001
Decimal.parse "aaaa" l . should_fail_with Number_Parse_Error.Error
Decimal.parse "aaaa" l . should_fail_with Number_Parse_Error
Test.specify "decimal should parse hundred factorial well" <|
txt = hundred_factorial.to_text + ".345"
@ -278,8 +278,8 @@ spec =
almost_max_long_times_three%10 . should_equal 8
1000%almost_max_long_times_three . should_equal 1000
1%0 . should_fail_with Arithmetic_Error.Error
almost_max_long_times_three%0 . should_fail_with Arithmetic_Error.Error
1%0 . should_fail_with Arithmetic_Error
almost_max_long_times_three%0 . should_fail_with Arithmetic_Error
1.0%0.0 . is_nan . should_be_true
1%0.0 . is_nan . should_be_true
@ -297,21 +297,21 @@ spec =
(1 < 0.99).should_be_false
(3 < hundred_factorial).should_be_true
(3 < very_negative).should_be_false
(3 < Nothing).should_fail_with Type_Error.Error
(3 < Nothing).should_fail_with Type_Error
(1.01 < 0.99).should_be_false
(1.01 < 1.02).should_be_true
(1.01 < 1).should_be_false
(1.01 < 2).should_be_true
(3.14 < hundred_factorial).should_be_true
(3.14 < very_negative).should_be_false
(1.5 < Nothing).should_fail_with Type_Error.Error
(1.5 < Nothing).should_fail_with Type_Error
(hundred_factorial < 1).should_be_false
(hundred_factorial < 1.5).should_be_false
(very_negative < 1).should_be_true
(very_negative < 1.5).should_be_true
(hundred_factorial < very_negative).should_be_false
(very_negative < hundred_factorial).should_be_true
(very_negative < Nothing).should_fail_with Type_Error.Error
(very_negative < Nothing).should_fail_with Type_Error
Test.specify "should support less than or equal to operator" <|
(1 <= 2).should_be_true
@ -321,21 +321,21 @@ spec =
(1 <= 0.99).should_be_false
(3 <= hundred_factorial).should_be_true
(3 <= very_negative).should_be_false
(3 <= Nothing).should_fail_with Type_Error.Error
(3 <= Nothing).should_fail_with Type_Error
(1.01 <= 0.99).should_be_false
(1.01 <= 1.02).should_be_true
(1.01 <= 1).should_be_false
(1.01 <= 2).should_be_true
(3.14 <= hundred_factorial).should_be_true
(3.14 <= very_negative).should_be_false
(1.5 <= Nothing).should_fail_with Type_Error.Error
(1.5 <= Nothing).should_fail_with Type_Error
(hundred_factorial <= 1).should_be_false
(hundred_factorial <= 1.5).should_be_false
(very_negative <= 1).should_be_true
(very_negative <= 1.5).should_be_true
(hundred_factorial <= very_negative).should_be_false
(very_negative <= hundred_factorial).should_be_true
(very_negative <= Nothing).should_fail_with Type_Error.Error
(very_negative <= Nothing).should_fail_with Type_Error
Test.specify "should support greater than operator" <|
(1 > 2).should_be_false
@ -345,21 +345,21 @@ spec =
(1 > 0.99).should_be_true
(3 > hundred_factorial).should_be_false
(3 > very_negative).should_be_true
(3 > Nothing).should_fail_with Type_Error.Error
(3 > Nothing).should_fail_with Type_Error
(1.01 > 0.99).should_be_true
(1.01 > 1.02).should_be_false
(1.01 > 1).should_be_true
(1.01 > 2).should_be_false
(3.14 > hundred_factorial).should_be_false
(3.14 > very_negative).should_be_true
(1.5 > Nothing).should_fail_with Type_Error.Error
(1.5 > Nothing).should_fail_with Type_Error
(hundred_factorial > 1).should_be_true
(hundred_factorial > 1.5).should_be_true
(very_negative > 1).should_be_false
(very_negative > 1.5).should_be_false
(hundred_factorial > very_negative).should_be_true
(very_negative > hundred_factorial).should_be_false
(very_negative > Nothing).should_fail_with Type_Error.Error
(very_negative > Nothing).should_fail_with Type_Error
Test.specify "should support greater than or equal to operator" <|
(1 >= 2).should_be_false
@ -369,21 +369,21 @@ spec =
(1 >= 0.99).should_be_true
(3 >= hundred_factorial).should_be_false
(3 >= very_negative).should_be_true
(3 >= Nothing).should_fail_with Type_Error.Error
(3 >= Nothing).should_fail_with Type_Error
(1.01 >= 0.99).should_be_true
(1.01 >= 1.02).should_be_false
(1.01 >= 1).should_be_true
(1.01 >= 2).should_be_false
(3.14 >= hundred_factorial).should_be_false
(3.14 >= very_negative).should_be_true
(1.5 >= Nothing).should_fail_with Type_Error.Error
(1.5 >= Nothing).should_fail_with Type_Error
(hundred_factorial >= 1).should_be_true
(hundred_factorial >= 1.5).should_be_true
(very_negative >= 1).should_be_false
(very_negative >= 1.5).should_be_false
(hundred_factorial >= very_negative).should_be_true
(very_negative >= hundred_factorial).should_be_false
(very_negative >= Nothing).should_fail_with Type_Error.Error
(very_negative >= Nothing).should_fail_with Type_Error
Test.specify "should be ordered by Default_Ordered_Comparator" <|
Ordering.compare 1 2 . should_equal Ordering.Less
@ -393,21 +393,21 @@ spec =
Ordering.compare 1 0.99 . should_equal Ordering.Greater
Ordering.compare 3 hundred_factorial . should_equal Ordering.Less
Ordering.compare 3 very_negative . should_equal Ordering.Greater
Ordering.compare 3 Nothing . should_fail_with Type_Error.Error
Ordering.compare 3 Nothing . should_fail_with Type_Error
Ordering.compare 1.01 0.99 . should_equal Ordering.Greater
Ordering.compare 1.01 1.02 . should_equal Ordering.Less
Ordering.compare 1.01 1 . should_equal Ordering.Greater
Ordering.compare 1.01 2 . should_equal Ordering.Less
Ordering.compare 3.14 hundred_factorial . should_equal Ordering.Less
Ordering.compare 3.14 very_negative . should_equal Ordering.Greater
Ordering.compare 1.5 Nothing . should_fail_with Type_Error.Error
Ordering.compare 1.5 Nothing . should_fail_with Type_Error
Ordering.compare hundred_factorial 1 . should_equal Ordering.Greater
Ordering.compare hundred_factorial 1.5 . should_equal Ordering.Greater
Ordering.compare very_negative 1 . should_equal Ordering.Less
Ordering.compare very_negative 1.5 . should_equal Ordering.Less
Ordering.compare hundred_factorial very_negative . should_equal Ordering.Greater
Ordering.compare very_negative hundred_factorial . should_equal Ordering.Less
Ordering.compare very_negative Nothing . should_fail_with Type_Error.Error
Ordering.compare very_negative Nothing . should_fail_with Type_Error
Test.specify "should expose exponentiation operations" <|
(3.14 ^ 2.71).should_equal 22.216689546 epsilon=eps

View File

@ -68,6 +68,6 @@ spec = Test.group "Object Comparator" <|
Test.specify "should fail gracefully for incomparable items" <|
(default_comparator 1 True).catch . should_equal (Incomparable_Values.Error 1 True)
(default_comparator (No_Ord.Value 1) (No_Ord.Value 2)).should_fail_with Incomparable_Values.Error
(default_comparator (No_Ord.Value 1) (No_Ord.Value 2)).should_fail_with Incomparable_Values
main = Test_Suite.run_main spec

View File

@ -56,13 +56,13 @@ spec =
val1 = (UPair.Value 1 2)
val2 = (UPair.Value 2 1)
err = Ordering.compare val1 val2
err.catch.is_a Incomparable_Values.Error . should_be_true
err.should_fail_with Incomparable_Values
Meta.is_same_object err.catch.left val1 . should_be_true
Meta.is_same_object err.catch.right val2 . should_be_true
Test.specify "should throw Type_Error when comparing different types" <|
Ordering.compare (UPair.Value 1 2) (Ord.Value 2) . should_fail_with Type_Error.Error
Ordering.compare 1 Nothing . should_fail_with Type_Error.Error
Ordering.compare (UPair.Value 1 2) (Ord.Value 2) . should_fail_with Type_Error
Ordering.compare 1 Nothing . should_fail_with Type_Error
Test.group "Ordering" <|
Test.specify "should allow conversion to sign representation" <|
@ -98,15 +98,15 @@ spec =
Ordering.Greater.and_then Ordering.Greater . should_equal Ordering.Greater
Test.specify "should handle partial ordering of Decimal type" <|
Ordering.compare Number.nan 42.0 . should_fail_with Incomparable_Values.Error
Ordering.compare 42.0 Number.nan . should_fail_with Incomparable_Values.Error
Ordering.compare Number.nan 42.0 . should_fail_with Incomparable_Values
Ordering.compare 42.0 Number.nan . should_fail_with Incomparable_Values
Ordering.compare 42.5 67.9 . should_equal Ordering.Less
Meta.is_same_object (Comparable.from Number.nan) (Comparable.from 42.0) . should_be_true
Test.specify "should fail with Type_Error for wrong type of that" <|
Ordering.compare Ordering.Less 1 . should_fail_with Type_Error.Error
Ordering.compare Ordering.Less Nothing . should_fail_with Type_Error.Error
Ordering.compare Ordering.Less "Hello" . should_fail_with Type_Error.Error
Ordering.compare Ordering.Less 1 . should_fail_with Type_Error
Ordering.compare Ordering.Less Nothing . should_fail_with Type_Error
Ordering.compare Ordering.Less "Hello" . should_fail_with Type_Error
main = Test_Suite.run_main spec

View File

@ -26,7 +26,7 @@ type_spec name ctor = Test.group name <|
ctor "A" "B" . at -2 . should_equal "A"
ctor "A" "B" . at 1 . should_equal "B"
ctor "A" "B" . at -1 . should_equal "B"
ctor "A" "B" . at 2 . should_fail_with Index_Out_Of_Bounds.Error
ctor "A" "B" . at 2 . should_fail_with Index_Out_Of_Bounds
Test.specify "should have allow getting by first, second and last" <|
ctor "A" "B" . first . should_equal "A"
@ -54,9 +54,9 @@ type_spec name ctor = Test.group name <|
ctor 1 3 . find (>0) start=1 . should_equal 3
ctor 1 3 . find (>0) start=2 . should_fail_with Not_Found
ctor 1 3 . find (>0) start=-1 . should_equal 3
ctor 1 3 . find (>0) start=4 . should_fail_with Index_Out_Of_Bounds.Error
ctor 1 3 . find (>0) start=-22 . should_fail_with Index_Out_Of_Bounds.Error
ctor 10 30 . find (>0) start=3 . should_fail_with Index_Out_Of_Bounds.Error
ctor 1 3 . find (>0) start=4 . should_fail_with Index_Out_Of_Bounds
ctor 1 3 . find (>0) start=-22 . should_fail_with Index_Out_Of_Bounds
ctor 10 30 . find (>0) start=3 . should_fail_with Index_Out_Of_Bounds
ctor 10 30 . find (>0) start=3 . catch . should_equal (Index_Out_Of_Bounds.Error 3 3)
ctor 1 3 . find (>3) if_missing=Nothing . should_equal Nothing
@ -69,10 +69,10 @@ type_spec name ctor = Test.group name <|
ctor 10 30 . index_of (>0) start=1 . should_equal 1
ctor 10 30 . index_of (>0) start=2 . should_equal Nothing
ctor 10 30 . index_of (>0) start=-1 . should_equal 1
ctor 10 30 . index_of (>0) start=3 . should_fail_with Index_Out_Of_Bounds.Error
ctor 10 30 . index_of (>0) start=3 . should_fail_with Index_Out_Of_Bounds
ctor 10 30 . index_of (>0) start=3 . catch . should_equal (Index_Out_Of_Bounds.Error 3 3)
ctor 10 30 . index_of (>0) start=4 . should_fail_with Index_Out_Of_Bounds.Error
ctor 10 30 . index_of (>0) start=-22 . should_fail_with Index_Out_Of_Bounds.Error
ctor 10 30 . index_of (>0) start=4 . should_fail_with Index_Out_Of_Bounds
ctor 10 30 . index_of (>0) start=-22 . should_fail_with Index_Out_Of_Bounds
Test.specify "should allow finding the last index of an item" <|
ctor 10 30 . last_index_of 10 . should_equal 0
@ -82,10 +82,10 @@ type_spec name ctor = Test.group name <|
ctor 10 30 . last_index_of (>20) . should_equal 1
ctor 10 30 . last_index_of (>0) start=1 . should_equal 1
ctor 10 30 . last_index_of (>0) start=-1 . should_equal 1
ctor 10 30 . last_index_of (>0) start=2 . should_fail_with Index_Out_Of_Bounds.Error
ctor 10 30 . last_index_of (>0) start=2 . should_fail_with Index_Out_Of_Bounds
ctor 10 30 . last_index_of (>0) start=2 . catch . should_equal (Index_Out_Of_Bounds.Error 2 2)
ctor 10 30 . last_index_of (>0) start=4 . should_fail_with Index_Out_Of_Bounds.Error
ctor 10 30 . last_index_of (>0) start=-22 . should_fail_with Index_Out_Of_Bounds.Error
ctor 10 30 . last_index_of (>0) start=4 . should_fail_with Index_Out_Of_Bounds
ctor 10 30 . last_index_of (>0) start=-22 . should_fail_with Index_Out_Of_Bounds
Test.specify "should allow folding an operator over its elements" <|
ctor 10 20 . fold 0 (+) . should_equal 30

View File

@ -44,12 +44,12 @@ spec = Test.group "Range" <|
10.down_to 0 . with_step 2 . should_equal (Range.Between 10 0 -2)
10.down_to 0 . with_step 2 . to_vector . should_equal [10, 8, 6, 4, 2]
1.up_to 2 . with_step 0.5 . should_fail_with Illegal_Argument.Error
1.up_to 2 . with_step -1 . should_fail_with Illegal_Argument.Error
0.up_to 2.0 . should_fail_with Illegal_Argument.Error
0.down_to 2.0 . should_fail_with Illegal_Argument.Error
Test.expect_panic_with (0.0.up_to 2) No_Such_Method.Error
Test.expect_panic_with (0.0.down_to 2) No_Such_Method.Error
1.up_to 2 . with_step 0.5 . should_fail_with Illegal_Argument
1.up_to 2 . with_step -1 . should_fail_with Illegal_Argument
0.up_to 2.0 . should_fail_with Illegal_Argument
0.down_to 2.0 . should_fail_with Illegal_Argument
Test.expect_panic_with (0.0.up_to 2) No_Such_Method
Test.expect_panic_with (0.0.down_to 2) No_Such_Method
Test.specify "should have a length" <|
0.up_to 100 . length . should_equal 100
@ -73,14 +73,14 @@ spec = Test.group "Range" <|
0.up_to 5 . not_empty . should_be_true
5.down_to 0 . not_empty . should_be_true
Test.specify "should allow getting by index using at" <|
0.up_to 0 . at 0 . should_fail_with Index_Out_Of_Bounds.Error
0.up_to 0 . at 0 . should_fail_with Index_Out_Of_Bounds
0.up_to 100 . at 0 . should_equal 0
0.up_to 100 . at 5 . should_equal 5
0.up_to 100 . at -1 . should_equal 99
0.up_to 100 . at -100 . should_equal 0
0.up_to 100 . at 100 . should_fail_with Index_Out_Of_Bounds.Error
0.up_to 100 . at 100 . should_fail_with Index_Out_Of_Bounds
0.up_to 100 . at 100 . catch . should_equal (Index_Out_Of_Bounds.Error 100 100)
0.up_to 100 . at -123 . should_fail_with Index_Out_Of_Bounds.Error
0.up_to 100 . at -123 . should_fail_with Index_Out_Of_Bounds
1.up_to 100 . with_step 5 . at 0 . should_equal 1
1.up_to 100 . with_step 5 . at 3 . should_equal 16
1.up_to 100 . with_step 5 . at -1 . should_equal 96
@ -98,27 +98,27 @@ spec = Test.group "Range" <|
1.up_to 100 . with_step 5 . get -1 . should_equal 96
1.up_to 100 . with_step 5 . get -3 . should_equal 86
Test.specify "should allow getting first" <|
0.up_to 0 . first . should_fail_with Index_Out_Of_Bounds.Error
0.up_to 0 . first . should_fail_with Index_Out_Of_Bounds
0.up_to 0 . first . catch . should_equal (Index_Out_Of_Bounds.Error 0 0)
3.up_to 100 . first . should_equal 3
0.down_to 0 . first . should_fail_with Index_Out_Of_Bounds.Error
0.down_to 0 . first . should_fail_with Index_Out_Of_Bounds
0.down_to -3 . first . should_equal 0
Test.specify "should allow getting second" <|
0.up_to 0 . second . should_fail_with Index_Out_Of_Bounds.Error
0.up_to 0 . second . should_fail_with Index_Out_Of_Bounds
0.up_to 0 . second . catch . should_equal (Index_Out_Of_Bounds.Error 1 0)
3.up_to 100 . second . should_equal 4
3.up_to 100 . with_step 10 . second . should_equal 13
3.up_to 10 . with_step 10 . second . should_fail_with Index_Out_Of_Bounds.Error
0.down_to 0 . second . should_fail_with Index_Out_Of_Bounds.Error
3.up_to 10 . with_step 10 . second . should_fail_with Index_Out_Of_Bounds
0.down_to 0 . second . should_fail_with Index_Out_Of_Bounds
0.down_to -3 . second . should_equal -1
0.down_to -3 . with_step 2 . second . should_equal -2
0.down_to -3 . with_step 4 . second . should_fail_with Index_Out_Of_Bounds.Error
0.down_to -3 . with_step 4 . second . should_fail_with Index_Out_Of_Bounds
Test.specify "should allow getting last" <|
0.up_to 0 . last . should_fail_with Index_Out_Of_Bounds.Error
0.up_to 0 . last . should_fail_with Index_Out_Of_Bounds
0.up_to 0 . last . catch . should_equal (Index_Out_Of_Bounds.Error 0 0)
3.up_to 100 . last . should_equal 99
3.up_to 100 . with_step 25 . last . should_equal 78
0.down_to 0 . last . should_fail_with Index_Out_Of_Bounds.Error
0.down_to 0 . last . should_fail_with Index_Out_Of_Bounds
0.down_to -3 . last . should_equal -2
Test.specify "should be able to be mapped over to make a Vector" <|
empty = 0.up_to 0
@ -142,9 +142,9 @@ spec = Test.group "Range" <|
range.filter (Filter_Condition.Is_In [7, 3, 2]) . should_equal [2, 3]
range.filter (Filter_Condition.Not_In [7, 3, 2]) . should_equal [1, 4, 5]
Test.expect_panic_with (range.filter (Filter_Condition.Starts_With "a")) No_Such_Method.Error
Test.expect_panic_with (range.filter (Filter_Condition.Like "a%")) Unsupported_Argument_Types.Error
Test.expect_panic_with (range.filter (Filter_Condition.Not_Like "a_")) Unsupported_Argument_Types.Error
Test.expect_panic_with (range.filter (Filter_Condition.Starts_With "a")) No_Such_Method
Test.expect_panic_with (range.filter (Filter_Condition.Like "a%")) Unsupported_Argument_Types
Test.expect_panic_with (range.filter (Filter_Condition.Not_Like "a_")) Unsupported_Argument_Types
range.filter Filter_Condition.Is_True . should_equal []
range.filter Filter_Condition.Is_False . should_equal []
range.filter Filter_Condition.Is_Nothing . should_equal []
@ -195,7 +195,7 @@ spec = Test.group "Range" <|
1.up_to 10 . find (> 10) . should_be_a Nothing
1.up_to 10 . find (v-> v%4 == 0) start=6 . should_equal 8
1.up_to 10 . find (< 5) start=6 . should_be_a Nothing
1.up_to 10 . find (< 5) start=10 . should_fail_with Index_Out_Of_Bounds.Error
1.up_to 10 . find (< 5) start=10 . should_fail_with Index_Out_Of_Bounds
1.up_to 10 . find (< 5) start=10 . catch . should_equal (Index_Out_Of_Bounds.Error 10 10)
Test.specify "should find index of elements" <|
1.up_to 10 . index_of (> 5) . should_equal 5
@ -204,12 +204,12 @@ spec = Test.group "Range" <|
1.up_to 10 . with_step 2 . index_of 7 . should_equal 3
1.up_to 10 . index_of (> 10) . should_be_a Nothing
1.up_to 10 . index_of (v-> v%4 == 0) start=6 . should_equal 7
1.up_to 10 . index_of 2.5 . should_fail_with Illegal_Argument.Error
1.up_to 10 . index_of 2.5 . should_fail_with Illegal_Argument
0.up_to 0 . index_of 1 . should_be_a Nothing
1.up_to 10 . index_of (< 5) start=3 . should_equal 3
1.up_to 10 . index_of (< 5) start=6 . should_be_a Nothing
1.up_to 10 . index_of (< 5) start=9 . should_be_a Nothing
1.up_to 10 . index_of (< 5) start=10 . should_fail_with Index_Out_Of_Bounds.Error
1.up_to 10 . index_of (< 5) start=10 . should_fail_with Index_Out_Of_Bounds
1.up_to 10 . index_of (< 5) start=10 . catch . should_equal (Index_Out_Of_Bounds.Error 10 10)
1.up_to 10 . index_of (< 5) start=-1 . should_equal Nothing
1.up_to 10 . index_of (< 5) start=-9 . should_equal 0
@ -220,15 +220,15 @@ spec = Test.group "Range" <|
1.up_to 10 . with_step 2 . last_index_of 7 . should_equal 3
1.up_to 10 . last_index_of (> 10) . should_be_a Nothing
1.up_to 10 . last_index_of (v-> v%4 == 0) start=6 . should_equal 3
1.up_to 10 . last_index_of 2.5 . should_fail_with Illegal_Argument.Error
1.up_to 10 . last_index_of 2.5 . should_fail_with Illegal_Argument
0.up_to 0 . last_index_of 1 . should_be_a Nothing
1.up_to 10 . last_index_of (< 5) start=2 . should_equal 2
1.up_to 10 . last_index_of (< 5) start=6 . should_equal 3
1.up_to 10 . last_index_of (< 5) start=-1 . should_equal 3
1.up_to 10 . last_index_of (< 5) start=-7 . should_equal 2
1.up_to 10 . last_index_of (< 5) start=9 . should_fail_with Index_Out_Of_Bounds.Error
1.up_to 10 . last_index_of (< 5) start=9 . should_fail_with Index_Out_Of_Bounds
1.up_to 10 . last_index_of (< 5) start=10 . catch . should_equal (Index_Out_Of_Bounds.Error 10 9)
1.up_to 10 . last_index_of (< 5) start=-10 . should_fail_with Index_Out_Of_Bounds.Error
1.up_to 10 . last_index_of (< 5) start=-10 . should_fail_with Index_Out_Of_Bounds
Test.specify "should allow conversion to vector" <|
1.up_to 6 . to_vector . should_equal [1, 2, 3, 4, 5]
Test.specify "should allow reversing" <|
@ -246,11 +246,11 @@ spec = Test.group "Range" <|
3.up_to 5 . contains 2 . should_be_false
0.up_to 10 . contains -3 . should_be_false
0.up_to 10 . contains 2.5 . should_fail_with Illegal_Argument.Error
0.up_to 10 . contains 3.0 . should_fail_with Illegal_Argument.Error
0.up_to 10 . contains 2.5 . should_fail_with Illegal_Argument
0.up_to 10 . contains 3.0 . should_fail_with Illegal_Argument
5.down_to 0 . contains 2.5 . should_fail_with Illegal_Argument.Error
5.down_to 0 . contains 3.0 . should_fail_with Illegal_Argument.Error
5.down_to 0 . contains 2.5 . should_fail_with Illegal_Argument
5.down_to 0 . contains 3.0 . should_fail_with Illegal_Argument
verify_contains range expected unexpected =
@ -470,27 +470,27 @@ spec = Test.group "Range" <|
verify_contains r4 [3] [-3, -2, -1, 0, 1, 2, 4, 5, 6, 7, 10]
Test.specify "should report errors if trying to set step to 0" <|
0.up_to 0 . with_step 0 . should_fail_with Illegal_State.Error
0.up_to 0 . with_step 0 . should_fail_with Illegal_State
invalid_range = Range.Between 0 0 0
invalid_range . length . should_fail_with Illegal_State.Error
invalid_range . first . should_fail_with Illegal_State.Error
invalid_range . second . should_fail_with Illegal_State.Error
invalid_range . last . should_fail_with Illegal_State.Error
invalid_range . at 0 . should_fail_with Illegal_State.Error
invalid_range . get 0 . should_fail_with Illegal_State.Error
invalid_range . is_empty . should_fail_with Illegal_State.Error
invalid_range . not_empty . should_fail_with Illegal_State.Error
invalid_range . each x->x . should_fail_with Illegal_State.Error
invalid_range . fold 0 (+) . should_fail_with Illegal_State.Error
invalid_range . length . should_fail_with Illegal_State
invalid_range . first . should_fail_with Illegal_State
invalid_range . second . should_fail_with Illegal_State
invalid_range . last . should_fail_with Illegal_State
invalid_range . at 0 . should_fail_with Illegal_State
invalid_range . get 0 . should_fail_with Illegal_State
invalid_range . is_empty . should_fail_with Illegal_State
invalid_range . not_empty . should_fail_with Illegal_State
invalid_range . each x->x . should_fail_with Illegal_State
invalid_range . fold 0 (+) . should_fail_with Illegal_State
## FIXME [RW] These tests are disabled because they fail in an
unexpected way due to a codegen issue (noted below). They should be
enabled once that is resolved.
See: https://www.pivotaltracker.com/story/show/181652841
#invalid_range . map x->x . should_fail_with Illegal_State.Error
#invalid_range . to_vector . should_fail_with Illegal_State.Error
invalid_range . any _->True . should_fail_with Illegal_State.Error
invalid_range . all _->True . should_fail_with Illegal_State.Error
invalid_range . find _->True . should_fail_with Illegal_State.Error
invalid_range . contains 0 . should_fail_with Illegal_State.Error
#invalid_range . map x->x . should_fail_with Illegal_State
#invalid_range . to_vector . should_fail_with Illegal_State
invalid_range . any _->True . should_fail_with Illegal_State
invalid_range . all _->True . should_fail_with Illegal_State
invalid_range . find _->True . should_fail_with Illegal_State
invalid_range . contains 0 . should_fail_with Illegal_State
main = Test_Suite.run_main spec

View File

@ -20,12 +20,12 @@ spec =
Test.specify "return an error if the vector lengths do not match" <|
known_xs = [2, 3, 5, 7, 9]
known_ys = [4, 5, 7, 10]
Regression.fit_least_squares known_xs known_ys . should_fail_with Illegal_Argument.Error
Regression.fit_least_squares known_xs known_ys . should_fail_with Illegal_Argument
Test.specify "return an error if the X values are all the same" <|
known_xs = [2, 2, 2, 2]
known_ys = [4, 5, 7, 10]
Regression.fit_least_squares known_xs known_ys . should_fail_with Regression.Fit_Error.Error
Regression.fit_least_squares known_xs known_ys . should_fail_with Regression.Fit_Error
Test.specify "compute the linear trend line" <|
known_xs = [2, 3, 5, 7, 9]

View File

@ -154,12 +154,12 @@ spec =
no_ord_set = [No_Ord.Value 10, No_Ord.Value 2, Nothing, No_Ord.Value 9]
Test.specify "should fail with Illegal_Argument on number based statistics for text Vector" <|
text_set.compute Statistic.Sum . should_fail_with Illegal_Argument.Error
text_set.compute Statistic.Mean . should_fail_with Illegal_Argument.Error
text_set.compute Statistic.Variance . should_fail_with Illegal_Argument.Error
text_set.compute Statistic.Skew . should_fail_with Illegal_Argument.Error
text_set.compute Statistic.Kurtosis . should_fail_with Illegal_Argument.Error
text_set.running Statistic.Sum . should_fail_with Illegal_Argument.Error
text_set.compute Statistic.Sum . should_fail_with Illegal_Argument
text_set.compute Statistic.Mean . should_fail_with Illegal_Argument
text_set.compute Statistic.Variance . should_fail_with Illegal_Argument
text_set.compute Statistic.Skew . should_fail_with Illegal_Argument
text_set.compute Statistic.Kurtosis . should_fail_with Illegal_Argument
text_set.running Statistic.Sum . should_fail_with Illegal_Argument
Test.specify "should be able to do Count, Minimum and Maximum on custom type with custom ordered comparator" <|
ord_set.compute . should_equal 3
@ -168,11 +168,11 @@ spec =
Test.specify "should fail with Incomparable_Values on custom incomparable type" <|
no_ord_set.compute . should_equal 3
no_ord_set.compute Statistic.Minimum . should_fail_with Incomparable_Values.Error
no_ord_set.compute Statistic.Maximum . should_fail_with Incomparable_Values.Error
no_ord_set.compute Statistic.Minimum . should_fail_with Incomparable_Values
no_ord_set.compute Statistic.Maximum . should_fail_with Incomparable_Values
Test.specify "should fail with Incomparable_Values on mixed Vectors" <|
[1, False].compute Statistic.Minimum . should_fail_with Incomparable_Values.Error
[1, False].compute Statistic.Minimum . should_fail_with Incomparable_Values
Test.group "Rank Data" <|
Test.specify "can rank a Decimal data series" <|
@ -197,13 +197,13 @@ spec =
Test.specify "should fail with Incomparable_Values on custom incomparable type" <|
values = [No_Ord.Value 10, No_Ord.Value 2, No_Ord.Value 9]
Statistic.rank_data values . should_fail_with Incomparable_Values.Error
Statistic.rank_data values . should_fail_with Incomparable_Values
Test.specify "should fail with Incomparable_Values on mixed Vectors" <|
Statistic.rank_data [1, "A"] . should_fail_with Incomparable_Values.Error
Statistic.rank_data [1, "A"] . should_fail_with Incomparable_Values
Test.specify "should fail with Illegal_Argument on Vectors with Nothing" <|
Statistic.rank_data [1, Nothing, 4] . should_fail_with Illegal_Argument.Error
Statistic.rank_data [1, Nothing, 4] . should_fail_with Illegal_Argument
Test.group "Correlation Statistics" <|
series_a = [0.22345,0.258315,0.74663,Nothing,0.686843,0.692246,Nothing,0.401859,0.725442,Nothing,0.963527,0.520363,0.633053,0.397123,Nothing,0.458942,0.036499,0.368194,0.598939,0.296476,0.093746,0.609329]
@ -240,28 +240,28 @@ spec =
Test.specify "should fail with Illegal_Argument if different lengths" <|
data = [[1,2,3,4],[10,20,30]]
data.first.compute (Statistic.Covariance data.second) . should_fail_with Illegal_Argument.Error
data.first.compute (Statistic.Pearson data.second) . should_fail_with Illegal_Argument.Error
data.first.compute (Statistic.Spearman data.second) . should_fail_with Illegal_Argument.Error
data.first.compute (Statistic.R_Squared data.second) . should_fail_with Illegal_Argument.Error
Statistic.covariance_matrix data . should_fail_with Illegal_Argument.Error
Statistic.pearson_correlation data . should_fail_with Illegal_Argument.Error
Statistic.spearman_correlation data . should_fail_with Illegal_Argument.Error
data.first.compute (Statistic.Covariance data.second) . should_fail_with Illegal_Argument
data.first.compute (Statistic.Pearson data.second) . should_fail_with Illegal_Argument
data.first.compute (Statistic.Spearman data.second) . should_fail_with Illegal_Argument
data.first.compute (Statistic.R_Squared data.second) . should_fail_with Illegal_Argument
Statistic.covariance_matrix data . should_fail_with Illegal_Argument
Statistic.pearson_correlation data . should_fail_with Illegal_Argument
Statistic.spearman_correlation data . should_fail_with Illegal_Argument
Test.specify "should fail with Illegal_Argument if not number based" <|
text = [["A","BC","CD"], ["0", "1", "2"], ["H", "I", "J"]]
text.first.compute (Statistic.Covariance text.second) . should_fail_with Illegal_Argument.Error
text.first.compute (Statistic.Pearson text.second) . should_fail_with Illegal_Argument.Error
text.first.compute (Statistic.Spearman text.second) . should_fail_with Illegal_Argument.Error
text.first.compute (Statistic.R_Squared text.second) . should_fail_with Illegal_Argument.Error
Statistic.covariance_matrix text . should_fail_with Illegal_Argument.Error
Statistic.pearson_correlation text . should_fail_with Illegal_Argument.Error
Statistic.spearman_correlation text . should_fail_with Illegal_Argument.Error
text.first.compute (Statistic.Covariance text.second) . should_fail_with Illegal_Argument
text.first.compute (Statistic.Pearson text.second) . should_fail_with Illegal_Argument
text.first.compute (Statistic.Spearman text.second) . should_fail_with Illegal_Argument
text.first.compute (Statistic.R_Squared text.second) . should_fail_with Illegal_Argument
Statistic.covariance_matrix text . should_fail_with Illegal_Argument
Statistic.pearson_correlation text . should_fail_with Illegal_Argument
Statistic.spearman_correlation text . should_fail_with Illegal_Argument
Test.group "Statistics - invalid input" <|
Test.specify "should fail with Illegal_Argument on number based statistics for text Vector" <|
series = [["A", "B", Nothing, "D"], ["A", "B", Nothing, "D"]]
Statistic.covariance_matrix series . should_fail_with Illegal_Argument.Error
Statistic.pearson_correlation series . should_fail_with Illegal_Argument.Error
Statistic.covariance_matrix series . should_fail_with Illegal_Argument
Statistic.pearson_correlation series . should_fail_with Illegal_Argument
main = Test_Suite.run_main spec

View File

@ -34,8 +34,8 @@ spec =
actual_mask . should_equal 0
Test.specify "should result in an error when an option is invalid" <|
Default_Engine.from_enso_options [""] . should_fail_with Invalid_Option.Error
Default_Engine.from_enso_options ["", Regex_Option.Ascii_Matching] . should_fail_with Invalid_Option.Error
Default_Engine.from_enso_options [""] . should_fail_with Invalid_Option
Default_Engine.from_enso_options ["", Regex_Option.Ascii_Matching] . should_fail_with Invalid_Option
Test.group "The default regex engine (Default_Engine)" <|
@ -70,11 +70,11 @@ spec =
Test.specify "should return a syntax error of the regex syntax is invalid" <|
engine = Default_Engine.new
engine.compile "^(a" [] . should_fail_with Syntax_Error.Error
engine.compile "^(a" [] . should_fail_with Syntax_Error
Test.specify "should throw an invalid options error if an option is invalid" <|
engine = Default_Engine.new
engine.compile "^a$" ["invalid"] . should_fail_with Invalid_Option.Error
engine.compile "^a$" ["invalid"] . should_fail_with Invalid_Option
Test.specify "should escape an expression for use as a literal" <|
pattern = "http://example.com"
@ -454,7 +454,9 @@ spec =
pattern = engine.compile "(.. .. )(?<letters>.+)()??(?<empty>)??" []
input = "aa ab abc a bc bcd"
match = pattern.match input mode=Matching_Mode.First
match . should_be_a Default_Engine.Match.Value
Test.specify "should be a Match" <|
match . should_be_a Default_Engine.Match.Value
Test.specify "should return the full match with index 0" <|
match.group 0 . should_equal "aa ab abc a bc bcd"
@ -469,8 +471,8 @@ spec =
match.group 3 . should_equal Nothing
Test.specify "should fail with No_Such_Group_Error if the group did not exist" <|
match.group "fail" . should_fail_with No_Such_Group.Error
match.group 5 . should_fail_with No_Such_Group.Error
match.group "fail" . should_fail_with No_Such_Group
match.group 5 . should_fail_with No_Such_Group
Test.specify "should make named groups accessible by index" <|
match.group 2 . should_equal (match.group "letters")
@ -480,7 +482,9 @@ spec =
pattern = engine.compile "(.. .. )(?<letters>.+)()??(?<empty>)??" []
input = "aa ab abc a bc bcd"
match = pattern.match input mode=Matching_Mode.First
match . should_be_a Default_Engine.Match.Value
Test.specify "should be a Match" <|
match . should_be_a Default_Engine.Match.Value
Test.specify "should return the results of all groups" <|
groups = match.groups
@ -497,7 +501,9 @@ spec =
pattern = engine.compile "(.. .. )(?<letters>.+)()??(?<empty>)??" []
input = "aa ab abc a bc bcd"
match = pattern.match input mode=Matching_Mode.First
match . should_be_a Default_Engine.Match.Value
Test.specify "should be a Match" <|
match . should_be_a Default_Engine.Match.Value
Test.specify "should return the results of all named groups" <|
groups = match.named_groups
@ -516,7 +522,9 @@ spec =
pattern = engine.compile "(.. .. )(?<letters>.+)()??(?<empty>)??" []
input = "aa ab abc a bc bcd"
match = pattern.match input mode=Matching_Mode.First
match . should_be_a Default_Engine.Match.Value
Test.specify "should be a Match" <|
match . should_be_a Default_Engine.Match.Value
Test.specify "should return the start of a group by index" <|
match.start 1 . should_equal 0
@ -529,15 +537,17 @@ spec =
match.start "empty" . should_equal Nothing
Test.specify "should return No_Such_Group_Error if the group doesn't exist" <|
match.start 5 . should_fail_with No_Such_Group.Error
match.start "nonexistent" . should_fail_with No_Such_Group.Error
match.start 5 . should_fail_with No_Such_Group
match.start "nonexistent" . should_fail_with No_Such_Group
Test.group "Match.end" <|
engine = Default_Engine.new
pattern = engine.compile "(.. .. )(?<letters>.+)()??(?<empty>)??" []
input = "aa ab abc a bc bcd"
match = pattern.match input mode=Matching_Mode.First
match . should_be_a Default_Engine.Match.Value
Test.specify "should be a Match" <|
match . should_be_a Default_Engine.Match.Value
Test.specify "should return the end of a group by index" <|
match.end 1 . should_equal 6
@ -550,15 +560,17 @@ spec =
match.end "empty" . should_equal Nothing
Test.specify "should return No_Such_Group_Error if the group doesn't exist" <|
match.end 5 . should_fail_with No_Such_Group.Error
match.end "nonexistent" . should_fail_with No_Such_Group.Error
match.end 5 . should_fail_with No_Such_Group
match.end "nonexistent" . should_fail_with No_Such_Group
Test.group "Match.span" <|
engine = Default_Engine.new
pattern = engine.compile "(.. .. )(?<letters>.+)()??(?<empty>)??" []
input = "aa ab abc a bc bcd"
match = pattern.match input mode=Matching_Mode.First
match . should_be_a Default_Engine.Match.Value
Test.specify "should be a Match" <|
match . should_be_a Default_Engine.Match.Value
Test.specify "should get the span of a group by index" <|
match.span 1 . should_equal (Utf_16_Span.Value (0.up_to 6) input)
@ -571,15 +583,17 @@ spec =
match.span "empty" . should_equal Nothing
Test.specify "should fail with a No_Such_Group_Error if the group doesn't exist" <|
match.span 5 . should_fail_with No_Such_Group.Error
match.span "nonexistent" . should_fail_with No_Such_Group.Error
match.span 5 . should_fail_with No_Such_Group
match.span "nonexistent" . should_fail_with No_Such_Group
Test.group "Match.start_position" <|
engine = Default_Engine.new
pattern = engine.compile "(.. .. )(?<letters>.+)()??(?<empty>)??" []
input = "aa ab abc a bc bcd"
match = pattern.match input mode=Matching_Mode.First
match . should_be_a Default_Engine.Match.Value
Test.specify "should be a Match" <|
match . should_be_a Default_Engine.Match.Value
Test.specify "should return the region start over which self match was performed" <|
match.start_position . should_equal 0
@ -589,7 +603,9 @@ spec =
pattern = engine.compile "(.. .. )(?<letters>.+)()??(?<empty>)??" []
input = "aa ab abc a bc bcd"
match = pattern.match input mode=Matching_Mode.First
match . should_be_a Default_Engine.Match.Value
Test.specify "should be a Match" <|
match . should_be_a Default_Engine.Match.Value
Test.specify "should return the region end over which self match was performed" <|
match.end_position . should_equal 18

View File

@ -18,7 +18,7 @@ spec =
Test.specify "Catches invalid character sets" <|
invalid = Encoding.Value "NotAValidCharacterSet"
invalid.to_java_charset . should_fail_with Illegal_Argument.Error
invalid.to_java_charset . should_fail_with Illegal_Argument
Test.specify "Can get full set of character sets" <|
character_sets = Encoding.all_character_sets

View File

@ -72,7 +72,7 @@ spec = Test.group 'Matching Helper' <|
(Error.throw Foo_Error).match_criteria [] [] . should_fail_with Foo_Error
Text_Matcher.Case_Sensitive.match_criteria [1, 2, 3] ["2"] name_mapper=(x-> if x == 3 then Error.throw Foo_Error else x.to_text) . should_fail_with Foo_Error
Test.expect_panic_with matcher=No_Such_Method.Error <|
Test.expect_panic_with matcher=No_Such_Method <|
Text_Matcher.Case_Sensitive.match_criteria ["a"] ["a"] name_mapper=_.nonexistent_function
main = Test_Suite.run_main spec

View File

@ -114,9 +114,9 @@ spec =
# Handling of Nothing
(accent_1 == Nothing) . should_be_false
(accent_1 != Nothing) . should_be_true
Ordering.compare accent_1 Nothing . should_fail_with Type_Error.Error
(accent_1 > Nothing) . should_fail_with Type_Error.Error
accent_1 . compare_to_ignore_case Nothing . should_fail_with Type_Error.Error
Ordering.compare accent_1 Nothing . should_fail_with Type_Error
(accent_1 > Nothing) . should_fail_with Type_Error
accent_1 . compare_to_ignore_case Nothing . should_fail_with Type_Error
earlier_suffix = "aooooz"
later_suffix = "bo"
@ -179,16 +179,16 @@ spec =
Test.specify "should return a dataflow error when accessing characters out of bounds" <|
str = kshi + facepalm + accent_1 + accent_2
str.at -5 . should_fail_with Index_Out_Of_Bounds.Error
str.at -5 . should_fail_with Index_Out_Of_Bounds
str.at -5 . catch . should_equal (Index_Out_Of_Bounds.Error -5 4)
str.at 4 . should_fail_with Index_Out_Of_Bounds.Error
str.at 4 . should_fail_with Index_Out_Of_Bounds
str.at 4 . catch . should_equal (Index_Out_Of_Bounds.Error 4 4)
str.get -5 . should_equal Nothing
str.get 4 . should_equal Nothing
str.get -5 "?" . should_equal "?"
"".first.should_fail_with Index_Out_Of_Bounds.Error
"".second.should_fail_with Index_Out_Of_Bounds.Error
"".last.should_fail_with Index_Out_Of_Bounds.Error
"".first.should_fail_with Index_Out_Of_Bounds
"".second.should_fail_with Index_Out_Of_Bounds
"".last.should_fail_with Index_Out_Of_Bounds
Test.specify "should be able to split the text into words" <|
"I have not one, but two cats.".words . should_equal ['I', 'have', 'not', 'one', ',', 'but', 'two', 'cats', '.']
@ -234,7 +234,7 @@ spec =
"".split "." . should_equal [""]
"abc[a-z]def".split "[a-z]" . should_equal ["abc", "def"]
'aśbs\u{301}c'.split 'ś' . should_equal ['a', 'b', 'c']
'abc'.split '' . should_fail_with Illegal_Argument.Error
'abc'.split '' . should_fail_with Illegal_Argument
Test.specify "should be able to split the text on arbitrary text sequence, case-insensitively" <|
matcher = Text_Matcher.Case_Insensitive
@ -244,7 +244,7 @@ spec =
"baB".split "b" matcher . should_equal ["", "a", ""]
"".split "a" matcher . should_equal [""]
'aŚbS\u{301}c'.split 'ś' matcher . should_equal ['a', 'b', 'c']
'abc'.split '' matcher . should_fail_with Illegal_Argument.Error
'abc'.split '' matcher . should_fail_with Illegal_Argument
Test.specify "should be able to split the text on Regex patterns" <|
"cababdabe" . split "ab" (Regex_Matcher.Value case_sensitivity=Case_Sensitivity.Sensitive) . should_equal ["c", "", "d", "e"]
@ -256,7 +256,7 @@ spec =
".a.".split "\." (Regex_Matcher.Value case_sensitivity=Case_Sensitivity.Sensitive) . should_equal ["", "a", ""]
"".split "a" (Regex_Matcher.Value case_sensitivity=Case_Sensitivity.Sensitive) . should_equal [""]
'aśbs\u{301}c'.split 'ś' (Regex_Matcher.Value case_sensitivity=Case_Sensitivity.Sensitive) . should_equal ['a', 'b', 'c']
'abc'.split '' (Regex_Matcher.Value case_sensitivity=Case_Sensitivity.Sensitive) . should_fail_with Illegal_Argument.Error
'abc'.split '' (Regex_Matcher.Value case_sensitivity=Case_Sensitivity.Sensitive) . should_fail_with Illegal_Argument
Test.specify "should be able to split the text on UTF-8 whitespace" <|
utf_8_whitespace.split "\s+" (Regex_Matcher.Value case_sensitivity=Case_Sensitivity.Sensitive) . should_equal utf_8_whitespace_split
@ -427,31 +427,31 @@ spec =
txt.take (0.up_to 14) . should_equal txt
txt.take (6.up_to 100) . should_equal "World!"
txt.take (Range.Between txt.length-1 txt.length) . should_equal "!"
txt.take (Range.Between txt.length txt.length) . should_fail_with Index_Out_Of_Bounds.Error
txt.take (Range.Between txt.length txt.length) . should_fail_with Index_Out_Of_Bounds
txt.take (Range.Between txt.length txt.length) . catch . should_equal (Index_Out_Of_Bounds.Error txt.length txt.length)
txt.take (Range.Between txt.length 100) . should_fail_with Index_Out_Of_Bounds.Error
txt.take (Range.Between txt.length 100) . should_fail_with Index_Out_Of_Bounds
txt.take (First 100) . should_equal txt
txt.take 100 . should_equal txt
txt.take (Last 100) . should_equal txt
txt.take (By_Index 100) . should_fail_with Index_Out_Of_Bounds.Error
txt.take (By_Index 13) . should_fail_with Index_Out_Of_Bounds.Error
txt.take (By_Index [0, 1, 13]) . should_fail_with Index_Out_Of_Bounds.Error
txt.take (By_Index [0, 14.up_to 15, 1]) . should_fail_with Index_Out_Of_Bounds.Error
txt.take (By_Index 100) . should_fail_with Index_Out_Of_Bounds
txt.take (By_Index 13) . should_fail_with Index_Out_Of_Bounds
txt.take (By_Index [0, 1, 13]) . should_fail_with Index_Out_Of_Bounds
txt.take (By_Index [0, 14.up_to 15, 1]) . should_fail_with Index_Out_Of_Bounds
txt.take (By_Index [0, 1, 6.up_to 100]) . should_equal "HeWorld!"
txt.take (By_Index [0, 1, 6.up_to 100 . with_step 2]) . should_equal "HeWrd"
txt.take (13.up_to 12) . should_fail_with Index_Out_Of_Bounds.Error
"".take (0.up_to 0) . should_fail_with Index_Out_Of_Bounds.Error
txt.take (13.up_to 12) . should_fail_with Index_Out_Of_Bounds
"".take (0.up_to 0) . should_fail_with Index_Out_Of_Bounds
"".take (0.up_to 0) . catch . should_equal (Index_Out_Of_Bounds.Error 0 0)
"".take (By_Index 0) . should_fail_with Index_Out_Of_Bounds.Error
"ABC".take (By_Index 3) . should_fail_with Index_Out_Of_Bounds.Error
txt.take (13.up_to 20) . should_fail_with Index_Out_Of_Bounds.Error
txt.take (13.up_to 20 . with_step 2) . should_fail_with Index_Out_Of_Bounds.Error
txt.take (By_Index [0.up_to 2, 13.up_to 20]) . should_fail_with Index_Out_Of_Bounds.Error
"".take (By_Index 0) . should_fail_with Index_Out_Of_Bounds
"ABC".take (By_Index 3) . should_fail_with Index_Out_Of_Bounds
txt.take (13.up_to 20) . should_fail_with Index_Out_Of_Bounds
txt.take (13.up_to 20 . with_step 2) . should_fail_with Index_Out_Of_Bounds
txt.take (By_Index [0.up_to 2, 13.up_to 20]) . should_fail_with Index_Out_Of_Bounds
txt.take (By_Index [0.up_to 0, 13.up_to 10, 2.up_to 2 . with_step 2]) . should_equal ""
txt.take (By_Index [0.up_to 2 . with_step 2, 13.up_to 20 . with_step 2]) . should_fail_with Index_Out_Of_Bounds.Error
txt.take (By_Index [0.up_to 2 . with_step 2, 13.up_to 20 . with_step 2]) . should_fail_with Index_Out_Of_Bounds
txt.take (By_Index [0.up_to 2 . with_step 2, 13.up_to 20 . with_step 2]) . catch . should_equal (Index_Out_Of_Bounds.Error 13 12)
txt.take (By_Index [0.up_to 2 . with_step 2, txt.length.up_to 100 . with_step 2]) . should_fail_with Index_Out_Of_Bounds.Error
"".take (By_Index 0) . should_fail_with Index_Out_Of_Bounds.Error
txt.take (By_Index [0.up_to 2 . with_step 2, txt.length.up_to 100 . with_step 2]) . should_fail_with Index_Out_Of_Bounds
"".take (By_Index 0) . should_fail_with Index_Out_Of_Bounds
Test.specify "take should work on grapheme clusters" <|
txt_1 = 'He\u0302llo\u0308 Wo\u0301rld!'
@ -525,7 +525,7 @@ spec =
"ABC".take (By_Index -1) . should_equal "C"
"ABC".take (By_Index [-1, -1, -1, -3, 2]) . should_equal "CCCAC"
"ABC".take (By_Index []) . should_equal ""
"ABC".take (By_Index ((-2).up_to -1)) . should_fail_with Illegal_Argument.Error
"ABC".take (By_Index ((-2).up_to -1)) . should_fail_with Illegal_Argument
"".take (Every 2) . should_equal ""
"".take (Every 2 first=1) . should_equal ""
"ABC".take (Every 5) . should_equal "A"
@ -572,16 +572,16 @@ spec =
txt.drop (First 100) . should_equal ""
txt.drop 100 . should_equal ""
txt.drop (Last 100) . should_equal ""
txt.drop (By_Index 100) . should_fail_with Index_Out_Of_Bounds.Error
txt.drop (By_Index 100) . should_fail_with Index_Out_Of_Bounds
txt.drop (By_Index 100) . catch . should_equal (Index_Out_Of_Bounds.Error 100 12)
txt.drop (By_Index 13) . should_fail_with Index_Out_Of_Bounds.Error
txt.drop (By_Index [0, 1, 13]) . should_fail_with Index_Out_Of_Bounds.Error
txt.drop (By_Index [0, 14.up_to 15, 1]) . should_fail_with Index_Out_Of_Bounds.Error
txt.drop (By_Index 13) . should_fail_with Index_Out_Of_Bounds
txt.drop (By_Index [0, 1, 13]) . should_fail_with Index_Out_Of_Bounds
txt.drop (By_Index [0, 14.up_to 15, 1]) . should_fail_with Index_Out_Of_Bounds
txt.drop (By_Index [0, 1, 6.up_to 100]) . should_equal "llo "
txt.drop (13.up_to 12) . should_fail_with Index_Out_Of_Bounds.Error
txt.drop (14.up_to 15) . should_fail_with Index_Out_Of_Bounds.Error
"".drop (By_Index 0) . should_fail_with Index_Out_Of_Bounds.Error
"".drop (0.up_to 0) . should_fail_with Index_Out_Of_Bounds.Error
txt.drop (13.up_to 12) . should_fail_with Index_Out_Of_Bounds
txt.drop (14.up_to 15) . should_fail_with Index_Out_Of_Bounds
"".drop (By_Index 0) . should_fail_with Index_Out_Of_Bounds
"".drop (0.up_to 0) . should_fail_with Index_Out_Of_Bounds
"".drop (0.up_to 0) . catch . should_equal (Index_Out_Of_Bounds.Error 0 0)
txt.drop (0.up_to 0) . should_equal txt
txt.drop (5.up_to 100) . should_equal "Hello"
@ -649,7 +649,7 @@ spec =
"".drop (While _->True) . should_equal ""
"".drop (0.up_to 0) . should_fail_with Index_Out_Of_Bounds.Error
"".drop (0.up_to 0) . should_fail_with Index_Out_Of_Bounds
'ABC\u{301}'.drop (0.up_to 0) . should_equal 'ABC\u{301}'
'ABC\u{301}'.drop (After "") . should_equal ''
@ -717,8 +717,8 @@ spec =
txt.insert 3 " Cruel" . should_equal (kshi + facepalm + accent_1 + " Cruel")
Test.specify "should report Index_Out_Of_Bounds.Error when inserting text at an invalid non-negative index position" <|
"Hello World!".insert ("Hello World!".length + 1) "foo" . should_fail_with Index_Out_Of_Bounds.Error
(kshi + facepalm + accent_1).insert 4 "foo" . should_fail_with Index_Out_Of_Bounds.Error
"Hello World!".insert ("Hello World!".length + 1) "foo" . should_fail_with Index_Out_Of_Bounds
(kshi + facepalm + accent_1).insert 4 "foo" . should_fail_with Index_Out_Of_Bounds
Test.specify "should insert text at a negative index position" <|
"Hello World!".insert -1 " Cruel" . should_equal "Hello World! Cruel"
@ -730,9 +730,9 @@ spec =
txt.insert -(txt.length) " Cruel" . should_equal (kshi + " Cruel" + facepalm + accent_1)
Test.specify "should report Index_Out_Of_Bounds.Error when inserting text at an invalid negative index position" <|
"Hello World!".insert -("Hello World!".length + 2) " Cruel" . should_fail_with Index_Out_Of_Bounds.Error
"Hello World!".insert -("Hello World!".length + 2) " Cruel" . should_fail_with Index_Out_Of_Bounds
txt = kshi + facepalm + accent_1
txt.insert -(txt.length + 2) " Cruel" . should_fail_with Index_Out_Of_Bounds.Error
txt.insert -(txt.length + 2) " Cruel" . should_fail_with Index_Out_Of_Bounds
Test.specify "should be able to check by index if is a digit" <|
str = kshi + "A12" + accent_2
@ -741,7 +741,7 @@ spec =
str.is_digit 2 . should_be_true
str.is_digit 3 . should_be_true
str.is_digit 4 . should_be_false
str.is_digit 5 . should_fail_with Index_Out_Of_Bounds.Error
str.is_digit 5 . should_fail_with Index_Out_Of_Bounds
Test.specify "should be able to check by negative index if is a digit" <|
str = kshi + "A12" + accent_2
@ -750,7 +750,7 @@ spec =
str.is_digit -3 . should_be_true
str.is_digit -4 . should_be_false
str.is_digit -5 . should_be_false
str.is_digit -100 . should_fail_with Index_Out_Of_Bounds.Error
str.is_digit -100 . should_fail_with Index_Out_Of_Bounds
Test.specify "should be able to check if a text consists only of whitespace" <|
' \t\n'.is_whitespace . should_be_true
@ -763,8 +763,8 @@ spec =
Test.specify "should return a dataflow error when checking is digit for out of bounds" <|
str = kshi + "A12" + accent_2
str.at -6 . should_fail_with Index_Out_Of_Bounds.Error
str.at 5 . should_fail_with Index_Out_Of_Bounds.Error
str.at -6 . should_fail_with Index_Out_Of_Bounds
str.at 5 . should_fail_with Index_Out_Of_Bounds
Test.specify "should be able to reverse characters" <|
"Hello World!".reverse . should_equal "!dlroW olleH"
@ -934,9 +934,9 @@ spec =
"HELLO".pad 8 "AB" . should_equal "HELLOABA"
"HELLO".pad 8 "AB" Location.Start . should_equal "BABHELLO"
"".pad 4 . should_equal " "
"A".pad 3 "" . should_fail_with Illegal_Argument.Error
"ABCDE".pad 3 "" . should_fail_with Illegal_Argument.Error
"".pad 0 "" . should_fail_with Illegal_Argument.Error
"A".pad 3 "" . should_fail_with Illegal_Argument
"ABCDE".pad 3 "" . should_fail_with Illegal_Argument
"".pad 0 "" . should_fail_with Illegal_Argument
"".pad 0 . should_equal ""
"ABC".pad 3 . should_equal "ABC"
@ -1111,12 +1111,12 @@ spec =
"Hello World!".index_of "o" start=5 . should_equal 7
"Hello World!".index_of "o" start=-5 . should_equal 7
"Hello World!".index_of "o" start=12 . should_equal Nothing
"Hello World!".index_of "o" start=13 . should_fail_with Index_Out_Of_Bounds.Error
"Hello World!".index_of "o" start=13 . should_fail_with Index_Out_Of_Bounds
"Hello World!".index_of "o" start=13 . catch . should_equal (Index_Out_Of_Bounds.Error 13 13)
"Hello World!".last_index_of "o" . should_equal 7
"Hello World!".last_index_of "o" start=6 . should_equal 4
"Hello World!".last_index_of "o" start=12 . should_fail_with Index_Out_Of_Bounds.Error
"Hello World!".last_index_of "o" start=12 . should_fail_with Index_Out_Of_Bounds
"Hello World!".last_index_of "o" start=12 . catch . should_equal (Index_Out_Of_Bounds.Error 12 12)
abc = 'A\u{301}ßC'

View File

@ -136,9 +136,9 @@ spec_with name create_new_date parse_date =
date_1<date_2 . should_be_false
datetime = Date_Time.new 2021 1 2 12 40
Ordering.compare date_1 datetime . should_fail_with Incomparable_Values.Error
date_1<datetime . should_fail_with Incomparable_Values.Error
date_1>=datetime . should_fail_with Incomparable_Values.Error
Ordering.compare date_1 datetime . should_fail_with Incomparable_Values
date_1<datetime . should_fail_with Incomparable_Values
date_1>=datetime . should_fail_with Incomparable_Values
date_1==datetime . should_be_false
Test.specify "should create date before epoch start" <|

View File

@ -330,12 +330,12 @@ spec_with name create_new_datetime parse_datetime nanoseconds_loss_in_precision=
time_1<time_2 . should_be_false
tod = Time_Of_Day.new 4 0 10
Ordering.compare time_1 tod . should_fail_with Incomparable_Values.Error
time_1<tod . should_fail_with Incomparable_Values.Error
Ordering.compare time_1 tod . should_fail_with Incomparable_Values
time_1<tod . should_fail_with Incomparable_Values
time_1==tod . should_be_false
date = Date.new 2021 1 1
Ordering.compare time_1 date . should_fail_with Incomparable_Values.Error
Ordering.compare time_1 date . should_fail_with Incomparable_Values
time_1==date . should_be_false
Test.specify "simple computations before Enso epoch should produce a warning" <|

View File

@ -58,12 +58,12 @@ spec =
periods = [(Period.new days=1), (Period.new 0), (Period.new years=30), (Period.new years=3 months=2)]
durations.each duration->
periods.each period->
(duration + period).should_fail_with Time_Error.Error
(duration - period).should_fail_with Time_Error.Error
(period + duration).should_fail_with Time_Error.Error
(period - duration).should_fail_with Time_Error.Error
(duration > period).should_fail_with Type_Error.Error
(duration < period).should_fail_with Type_Error.Error
(duration + period).should_fail_with Time_Error
(duration - period).should_fail_with Time_Error
(period + duration).should_fail_with Time_Error
(period - duration).should_fail_with Time_Error
(duration > period).should_fail_with Type_Error
(duration < period).should_fail_with Type_Error
Test.specify "Date_Time supports adding and subtracting Duration" <|
((Date_Time.new 2022 10 1 hour=10) + (Duration.new hours=2)) . should_equal (Date_Time.new 2022 10 1 hour=12)

View File

@ -29,9 +29,9 @@ spec =
(Period.between (Date.new 2022 10 19) (Date.new 2022 11 01)) . should_equal (Period.new days=13)
Test.specify "should not compare between two periods" <|
((Period.new days=10) > (Period.new days=1)) . should_fail_with Incomparable_Values.Error
((Period.new years=10) > (Period.new days=1)) . should_fail_with Incomparable_Values.Error
((Period.new years=10 months=3) > (Period.new months=5)) . should_fail_with Incomparable_Values.Error
((Period.new days=10) > (Period.new days=1)) . should_fail_with Incomparable_Values
((Period.new years=10) > (Period.new days=1)) . should_fail_with Incomparable_Values
((Period.new years=10 months=3) > (Period.new months=5)) . should_fail_with Incomparable_Values
Test.specify "two Periods are equal iff their fields are equal" <|
((Period.new days=1) == (Period.new days=1)) . should_be_true

View File

@ -117,7 +117,7 @@ specWith name create_new_time parse_time =
time_1!=time_2 . should_be_true
time_1>time_2 . should_be_true
time_1<time_2 . should_be_false
time_2<(Date_Time.new 1999 1 1 4 0 10) . should_fail_with Incomparable_Values.Error
time_2<(Date_Time.new 1999 1 1 4 0 10) . should_fail_with Incomparable_Values
Test.specify "should correctly determine the type of timeofday" <|
new_timeofday = create_new_time 15 37 58

View File

@ -99,9 +99,9 @@ spec = Test.group "Vectors" <|
Test.specify "should allow to store dataflow errors and raise them on access" <|
vec = [Error.throw (My_Error.Value "foo"), "bar"]
vec.at 1 . should_equal "bar"
vec.at 0 . should_fail_with My_Error.Value
vec.at 0 . should_fail_with My_Error
vec.get 1 . should_equal "bar"
vec.get 0 . should_fail_with My_Error.Value
vec.get 0 . should_fail_with My_Error
Test.specify "should allow accessing elements with negative indices" <|
[1,2,3].at -1 . should_equal 3
@ -112,8 +112,8 @@ spec = Test.group "Vectors" <|
[1,2,3].get -3 . should_equal 1
Test.specify "should correctly handle out of bounds access" <|
[1,2,3].at -4 . should_fail_with Index_Out_Of_Bounds.Error
[1,2,3].at 3 . should_fail_with Index_Out_Of_Bounds.Error
[1,2,3].at -4 . should_fail_with Index_Out_Of_Bounds
[1,2,3].at 3 . should_fail_with Index_Out_Of_Bounds
[1,2,3].get -4 . should_equal Nothing
[1,2,3].get 3 . should_equal Nothing
[1,2,3].get -4 "???" . should_equal "???"
@ -167,7 +167,7 @@ spec = Test.group "Vectors" <|
vec.filter (x -> x > 3) . should_equal [4, 5]
vec.filter (x -> x == 1) . should_equal [1]
vec.filter (x -> x < 0) . should_equal []
vec.filter (x -> if x == 2 then Error.throw <| My_Error.Value "foo" else True) . should_fail_with My_Error.Value
vec.filter (x -> if x == 2 then Error.throw <| My_Error.Value "foo" else True) . should_fail_with My_Error
Test.specify "should filter elements by Filter_Condition" <|
vec = [1, 2, 3, 4, 5]
@ -185,7 +185,7 @@ spec = Test.group "Vectors" <|
vec.filter (Filter_Condition.Is_In []) . should_equal []
vec.filter (Filter_Condition.Not_In [7, 3, 2, 2]) . should_equal [1, 4, 5]
Test.expect_panic_with (vec.filter (Filter_Condition.Starts_With "a")) No_Such_Method.Error
Test.expect_panic_with (vec.filter (Filter_Condition.Starts_With "a")) No_Such_Method
vec.filter Filter_Condition.Is_True . should_equal []
vec.filter Filter_Condition.Is_False . should_equal []
vec.filter Filter_Condition.Is_Nothing . should_equal []
@ -213,7 +213,7 @@ spec = Test.group "Vectors" <|
txtvec.filter (Filter_Condition.Less than="a") . should_equal []
txtvec.filter (Filter_Condition.Greater than="b") . should_equal ["bbb", "cccc", "baaa", "ś"]
txtvec.filter (Filter_Condition.Between "b" "c") . should_equal ["bbb", "baaa"]
Test.expect_panic_with (txtvec.filter (Filter_Condition.Starts_With 42)) Unsupported_Argument_Types.Error
Test.expect_panic_with (txtvec.filter (Filter_Condition.Starts_With 42)) Unsupported_Argument_Types
txtvec.filter Filter_Condition.Is_True . should_equal []
txtvec.filter (Filter_Condition.Is_In [1, 2]) . should_equal []
txtvec.filter (Filter_Condition.Is_In ["bbb", 's\u0301', "bbb", "FOOBAR"]) . should_equal ["bbb", "ś"]
@ -259,15 +259,15 @@ spec = Test.group "Vectors" <|
Test.specify "should filter elements with indices" <|
[0, 10, 2, 2].filter_with_index (==) . should_equal [0, 2]
([1, 2, 3, 4].filter_with_index ix-> _-> ix < 2) . should_equal [1, 2]
([1, 2, 3, 4].filter_with_index ix-> _-> if ix == 1 then Error.throw <| My_Error.Value "foo" else True) . should_fail_with My_Error.Value
([1, 2, 3, 4].filter_with_index ix-> _-> if ix == 1 then Error.throw <| My_Error.Value "foo" else True) . should_fail_with My_Error
Test.specify "should partition elements" <|
[1, 2, 3, 4, 5].partition (x -> x % 2 == 0) . should_equal <| Pair.new [2, 4] [1, 3, 5]
([1, 2, 3, 4].partition x-> if x == 1 then Error.throw <| My_Error.Value "foo" else True) . should_fail_with My_Error.Value
([1, 2, 3, 4].partition x-> if x == 1 then Error.throw <| My_Error.Value "foo" else True) . should_fail_with My_Error
Test.specify "should partition elements with indices" <|
["a", "b", "c", "d"].partition_with_index (ix -> _ -> ix % 2 == 0) == (Pair.new ["a", "c"] ["b", "d"])
["a", "b", "c", "d"].partition_with_index (ix -> _ -> if ix % 2 == 0 then Error.throw <| My_Error.Value "foo" else True) . should_fail_with My_Error.Value
["a", "b", "c", "d"].partition_with_index (ix -> _ -> if ix % 2 == 0 then Error.throw <| My_Error.Value "foo" else True) . should_fail_with My_Error
Test.specify "should allow to join a vector of text elements to form a single text" <|
["a", "b", "c"].join . should_equal "abc"
@ -338,7 +338,7 @@ spec = Test.group "Vectors" <|
[1, 2, 3, 4, 5, 6].short_display_text max_entries=3 . should_equal "[1, 2, 3 and 3 more elements]"
(0.up_to 100).to_vector.short_display_text max_entries=2 . should_equal "[0, 1 and 98 more elements]"
[].short_display_text max_entries=0 . should_fail_with Illegal_Argument.Error
[].short_display_text max_entries=0 . should_fail_with Illegal_Argument
Test.specify "should define equality" <|
[1,2,3]==[1,2] . should_be_false
@ -348,7 +348,7 @@ spec = Test.group "Vectors" <|
Test.specify "should define concatenation" <|
concat = [1, 2, 3] + [4, 5, 6]
concat.should_equal [1, 2, 3, 4, 5, 6]
[1, 2, 3]+1 . should_fail_with Type_Error.Error
[1, 2, 3]+1 . should_fail_with Type_Error
Test.specify "should allow finding a value" <|
input = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
@ -358,10 +358,10 @@ spec = Test.group "Vectors" <|
input.find (x -> x%3 == 2) start=3 . should_equal 5
input.find (x -> x%3 == 2) start=-3 . should_equal 8
input.find (x -> x%3 == 2) start=10 . should_fail_with Not_Found
input.find (x -> x%3 == 2) start=11 . should_fail_with Index_Out_Of_Bounds.Error
input.find (x -> x%3 == 2) start=11 . should_fail_with Index_Out_Of_Bounds
input.find (x -> x%3 == 2) start=11 . catch . should_equal (Index_Out_Of_Bounds.Error 11 11)
input.find (x -> x%3 == 2) start=100 . should_fail_with Index_Out_Of_Bounds.Error
input.find (x -> x%3 == 2) start=-100 . should_fail_with Index_Out_Of_Bounds.Error
input.find (x -> x%3 == 2) start=100 . should_fail_with Index_Out_Of_Bounds
input.find (x -> x%3 == 2) start=-100 . should_fail_with Index_Out_Of_Bounds
input.find (x -> x%3 == 3) if_missing=Nothing . should_equal Nothing
Test.specify "should allow finding the index of a value" <|
@ -373,9 +373,9 @@ spec = Test.group "Vectors" <|
input.index_of 2 start=3 . should_equal 5
input.index_of 2 start=-2 . should_equal 8
input.index_of 2 start=10 . should_equal Nothing
input.index_of 2 start=11 . should_fail_with Index_Out_Of_Bounds.Error
input.index_of 2 start=11 . should_fail_with Index_Out_Of_Bounds
input.index_of 2 start=11 . catch . should_equal (Index_Out_Of_Bounds.Error 11 11)
input.index_of 2 start=-11 . should_fail_with Index_Out_Of_Bounds.Error
input.index_of 2 start=-11 . should_fail_with Index_Out_Of_Bounds
Test.specify "should allow finding the last index of a value" <|
input = [1, 2, 3, 4, 1, 2, 3, 1, 2, 1]
@ -384,9 +384,9 @@ spec = Test.group "Vectors" <|
[].last_index_of 5 . should_equal Nothing
input.last_index_of 2 start=4 . should_equal 1
input.last_index_of 2 start=-1 . should_equal 8
input.last_index_of 2 start=10 . should_fail_with Index_Out_Of_Bounds.Error
input.last_index_of 2 start=10 . should_fail_with Index_Out_Of_Bounds
input.last_index_of 2 start=10 . catch . should_equal (Index_Out_Of_Bounds.Error 10 10)
input.last_index_of 2 start=-11 . should_fail_with Index_Out_Of_Bounds.Error
input.last_index_of 2 start=-11 . should_fail_with Index_Out_Of_Bounds
Test.specify "should be convertible to a list" <|
[].to_list . should_equal List.Nil
@ -412,21 +412,21 @@ spec = Test.group "Vectors" <|
vec.take (2.up_to 4) . should_equal [3, 4]
vec.take (0.up_to 0) . should_equal []
vec.take (100.up_to 100) . should_fail_with Index_Out_Of_Bounds.Error
vec.take (100.up_to 100) . should_fail_with Index_Out_Of_Bounds
vec.take (100.up_to 100) . catch . should_equal (Index_Out_Of_Bounds.Error 100 6)
vec.take (0.up_to 100) . should_equal vec
[].take (0.up_to 0) . should_fail_with Index_Out_Of_Bounds.Error
[].take (0.up_to 0) . should_fail_with Index_Out_Of_Bounds
[].take (0.up_to 0) . catch . should_equal (Index_Out_Of_Bounds.Error 0 0)
vec.take (100.up_to 99) . should_fail_with Index_Out_Of_Bounds.Error
vec.take (100.up_to 99) . should_fail_with Index_Out_Of_Bounds
vec.drop (2.up_to 4) . should_equal [1, 2, 5, 6]
vec.drop (0.up_to 0) . should_equal vec
vec.drop (100.up_to 100) . should_fail_with Index_Out_Of_Bounds.Error
vec.drop (100.up_to 100) . should_fail_with Index_Out_Of_Bounds
vec.drop (100.up_to 100) . catch . should_equal (Index_Out_Of_Bounds.Error 100 6)
vec.drop (0.up_to 100) . should_equal []
[].drop (0.up_to 0) . should_fail_with Index_Out_Of_Bounds.Error
[].drop (0.up_to 0) . should_fail_with Index_Out_Of_Bounds
[].drop (0.up_to 0) . catch . should_equal (Index_Out_Of_Bounds.Error 0 0)
vec.drop (100.up_to 99) . should_fail_with Index_Out_Of_Bounds.Error
vec.drop (100.up_to 99) . should_fail_with Index_Out_Of_Bounds
vec.take (First 4) . should_equal first_four
vec.take (First 0) . should_equal []
@ -465,8 +465,8 @@ spec = Test.group "Vectors" <|
vec.take (Every 2 first=100) . should_equal []
vec.take (Every 200) . should_equal [1]
[].take (Every 2) . should_equal []
vec.take (Every 0) . should_fail_with Illegal_Argument.Error
[].take (Every 0) . should_fail_with Illegal_Argument.Error
vec.take (Every 0) . should_fail_with Illegal_Argument
[].take (Every 0) . should_fail_with Illegal_Argument
vec.drop (Every 1) . should_equal []
vec.drop (Every 3) . should_equal [2, 3, 5, 6]
@ -475,11 +475,11 @@ spec = Test.group "Vectors" <|
vec.drop (Every 2 first=100) . should_equal vec
vec.drop (Every 200) . should_equal [2, 3, 4, 5, 6]
[].drop (Every 2) . should_equal []
vec.drop (Every 0) . should_fail_with Illegal_Argument.Error
[].drop (Every 0) . should_fail_with Illegal_Argument.Error
vec.drop (Every 0) . should_fail_with Illegal_Argument
[].drop (Every 0) . should_fail_with Illegal_Argument
vec.take (By_Index 0) . should_equal [1]
[].take (By_Index 0) . should_fail_with Index_Out_Of_Bounds.Error
[].take (By_Index 0) . should_fail_with Index_Out_Of_Bounds
vec.take (By_Index []) . should_equal []
vec.take (By_Index [-1, -1]) . should_equal [6, 6]
vec.take (By_Index [0, 0, 3.up_to 100]) . should_equal [1, 1, 4, 5, 6]
@ -487,8 +487,8 @@ spec = Test.group "Vectors" <|
vec.take (By_Index [0.up_to 100 . with_step 2, 1.up_to 6 . with_step 2]) . should_equal [1, 3, 5, 2, 4, 6]
vec.take (By_Index [1.up_to 3, 2.up_to 5]) . should_equal [2, 3, 3, 4, 5]
vec.take (By_Index [2.up_to 5, 1.up_to 3]) . should_equal [3, 4, 5, 2, 3]
vec.take (By_Index [0, 1, 100.up_to 200]) . should_fail_with Index_Out_Of_Bounds.Error
vec.take (By_Index 100) . should_fail_with Index_Out_Of_Bounds.Error
vec.take (By_Index [0, 1, 100.up_to 200]) . should_fail_with Index_Out_Of_Bounds
vec.take (By_Index 100) . should_fail_with Index_Out_Of_Bounds
vec.drop (By_Index 0) . should_equal [2, 3, 4, 5, 6]
vec.drop (By_Index []) . should_equal vec
@ -498,8 +498,8 @@ spec = Test.group "Vectors" <|
vec.drop (By_Index [0.up_to 100 . with_step 2, 1.up_to 6 . with_step 2]) . should_equal []
vec.drop (By_Index [1.up_to 3, 2.up_to 5]) . should_equal [1, 6]
vec.drop (By_Index [2.up_to 5, 1.up_to 3]) . should_equal [1, 6]
vec.drop (By_Index [0, 1, 100.up_to 200]) . should_fail_with Index_Out_Of_Bounds.Error
vec.drop (By_Index 100) . should_fail_with Index_Out_Of_Bounds.Error
vec.drop (By_Index [0, 1, 100.up_to 200]) . should_fail_with Index_Out_Of_Bounds
vec.drop (By_Index 100) . should_fail_with Index_Out_Of_Bounds
[1, 3, 5, 6, 8, 9, 10, 11, 13].take (While (x-> x%2 == 1)) . should_equal [1, 3, 5]
[1, 2, 3] . take (While (_ > 10)) . should_equal []
@ -559,11 +559,11 @@ spec = Test.group "Vectors" <|
[Time_Of_Day.new 12, Time_Of_Day.new 10 30].sort . should_equal [Time_Of_Day.new 10 30, Time_Of_Day.new 12]
[Date_Time.new 2000 12 30 12 30, Date_Time.new 2000 12 30 12 00].sort . should_equal [Date_Time.new 2000 12 30 12 00, Date_Time.new 2000 12 30 12 30]
["aa", 2].sort . should_fail_with Incomparable_Values.Error
[2, Date.new 1999].sort . should_fail_with Incomparable_Values.Error
[Date_Time.new 1999 1 1 12 30, Date.new 1999].sort . should_fail_with Incomparable_Values.Error
[Date_Time.new 1999 1 1 12 30, Time_Of_Day.new 12 30].sort . should_fail_with Incomparable_Values.Error
Test.expect_panic_with ([3,2,1].to_array.sort 42) Type_Error.Error
["aa", 2].sort . should_fail_with Incomparable_Values
[2, Date.new 1999].sort . should_fail_with Incomparable_Values
[Date_Time.new 1999 1 1 12 30, Date.new 1999].sort . should_fail_with Incomparable_Values
[Date_Time.new 1999 1 1 12 30, Time_Of_Day.new 12 30].sort . should_fail_with Incomparable_Values
Test.expect_panic_with ([3,2,1].to_array.sort 42) Type_Error
Test.specify "should leave the original vector unchanged" <|
non_empty_vec = [2, 4, 2, 3, 2, 3]
@ -609,7 +609,7 @@ spec = Test.group "Vectors" <|
Test.specify "should correctly propagate error through map" <|
[1, 2, 3].map Error.throw . catch . should_equal 1
fun a = if a == 3 then Error.throw (My_Error.Value a) else a
[1, 2, 3, 4].map fun . catch My_Error.Value . should_equal (My_Error.Value 3)
[1, 2, 3, 4].map fun . catch My_Error . should_equal (My_Error.Value 3)
Test.specify "should pad elements" <|
[].pad 3 0 . should_equal [0, 0, 0]
@ -634,17 +634,17 @@ spec = Test.group "Vectors" <|
Test.specify "should allow inserting elements" <|
[2, 3].insert . should_equal [2, 3, Nothing]
[2, 3].insert item=1 . should_equal [2, 3, 1]
[2, 3].insert 100 item=1 . should_fail_with Index_Out_Of_Bounds.Error
[2, 3].insert 100 item=1 . should_fail_with Index_Out_Of_Bounds
[2, 3].insert 0 item=1 . should_equal [1, 2, 3]
[2, 3].insert 0 . should_equal [Nothing, 2, 3]
[2, 3].insert 2 . should_equal [2, 3, Nothing]
[1, 2, 3].insert -1 item=4 . should_equal [1, 2, 4, 3]
[1, 2, 3].insert -20 item=4 . should_fail_with Index_Out_Of_Bounds.Error
[1, 2, 3].insert -20 item=4 . should_fail_with Index_Out_Of_Bounds
Test.specify "should allow removing elements" <|
[1, 2, 3].remove . should_equal [1, 2]
[1, 2, 3].remove 100 . should_fail_with Index_Out_Of_Bounds.Error
[1, 2, 3].remove -123 . should_fail_with Index_Out_Of_Bounds.Error
[1, 2, 3].remove 100 . should_fail_with Index_Out_Of_Bounds
[1, 2, 3].remove -123 . should_fail_with Index_Out_Of_Bounds
[1, 2, 3].remove 0 . should_equal [2, 3]
[1, 2, 3].remove -1 . should_equal [1, 2]

View File

@ -14,7 +14,7 @@ spec =
test_headers = [Header.application_json, Header.new "X-Foo-Id" "0123456789"]
Test.group "Request" <|
Test.specify "should return error when creating request from invalid URI" <|
Request.new HTTP_Method.Post "invalid uri" . should_fail_with Syntax_Error.Error
Request.new HTTP_Method.Post "invalid uri" . should_fail_with Syntax_Error
Test.specify "should get method" <|
req = Request.new HTTP_Method.Post test_uri
req.method.should_equal HTTP_Method.Post

View File

@ -40,7 +40,7 @@ spec =
http = HTTP.new (version = version_setting)
http.version.should_equal version_setting
Test.specify "should throw error when requesting invalid URI" <|
HTTP.new.get "not a uri" . should_fail_with Syntax_Error.Error
HTTP.new.get "not a uri" . should_fail_with Syntax_Error
Test.specify "should send Get request using fetch" <|
expected_response = Json.parse <| '''
@ -85,7 +85,7 @@ spec =
res = HTTP.fetch url_get
res.parse_json.should_equal expected_response
Test.specify "should return error if the fetch method fails" <|
HTTP.fetch "http://undefined_host" . should_fail_with Request_Error.Error
HTTP.fetch "http://undefined_host" . should_fail_with Request_Error
Test.specify "should send Head request" <|
res = HTTP.new.head url_get

View File

@ -29,7 +29,7 @@ spec =
addr.raw_query.should_equal "%D0%9A%D0%BE%D0%B4"
addr.raw_fragment.should_fail_with Nothing
Test.specify "should return Syntax_Error when parsing invalid URI" <|
URI.parse "a b c" . should_fail_with Syntax_Error.Error
URI.parse "a b c" . should_fail_with Syntax_Error
Test.specify "should compare two URIs for equality" <|
(URI.parse "http://google.com").should_equal (URI.parse "http://google.com")

View File

@ -17,7 +17,7 @@ spec = Test.group "Random" <|
rng = Random.new 12345
rng.integer . should_equal 51
rng.integer 0 10000 . should_equal 9080
rng.integer 0 100000000000000 . should_fail_with Illegal_Argument.Error
rng.integer 0 100000000000000 . should_fail_with Illegal_Argument
random_range = 0.up_to 1000 . map _->rng.integer . compute_bulk [Statistic.Minimum, Statistic.Maximum]
(random_range.at 0 >= 0) . should_equal True

View File

@ -56,10 +56,10 @@ spec =
Test.specify "should allow recovery of only a specific error-type" <|
recover_illegal_argument ~action =
action . catch Illegal_Argument.Error err->
action . catch Illegal_Argument err->
"recovered error: "+err.message
(recover_illegal_argument (Error.throw (Illegal_Argument.Error "foo"))) . should_equal "recovered error: foo"
(recover_illegal_argument (Error.throw (Illegal_State.Error "bar"))) . should_fail_with Illegal_State.Error
(recover_illegal_argument (Error.throw (Illegal_State.Error "bar"))) . should_fail_with Illegal_State
Test.specify "should implement to_display_text" <|
Error.throw Nothing . to_display_text . should_equal "Error: Nothing"
@ -170,7 +170,7 @@ spec =
parse "42" . should_equal 42
dataflow_error = parse "foo"
dataflow_error.catch . should_equal (Illegal_Argument.Error 'The provided string is not a valid number: For input string: "foo"')
Test.expect_panic_with (parse 0.0) Unsupported_Argument_Types.Error
Test.expect_panic_with (parse 0.0) Unsupported_Argument_Types
Test.specify "should allow to throw raw Java exceptions" <|
exception = Panic.catch NumberFormatException (throw_raw_java "foo") (p -> p)
@ -201,11 +201,11 @@ spec =
caught_2.stack_trace.second.name . should_equal "Error_Spec.throw_raw_java"
Test.specify "should allow to catch a specific panic type easily" <|
message_1 = Panic.catch Illegal_Argument.Error (Panic.throw (Illegal_Argument.Error "msg" Nothing)) caught_panic->
message_1 = Panic.catch Illegal_Argument (Panic.throw (Illegal_Argument.Error "msg" Nothing)) caught_panic->
caught_panic.payload.message
message_1 . should_equal "msg"
error = Panic.recover Any <| Panic.catch Illegal_Argument.Error (Panic.throw (Illegal_State.Error "foo" Nothing)) caught_panic->
error = Panic.recover Any <| Panic.catch Illegal_Argument (Panic.throw (Illegal_State.Error "foo" Nothing)) caught_panic->
caught_panic.payload.message
error.catch . should_be_an Illegal_State.Error
@ -219,21 +219,21 @@ spec =
message_4 = Panic.catch Any (Long.parseLong "foo") _->
"polyglot2"
message_4 . should_equal "polyglot2"
message_5 = Panic.catch Unsupported_Argument_Types.Error (Long.parseLong 0) _->
message_5 = Panic.catch Unsupported_Argument_Types (Long.parseLong 0) _->
"uat"
message_5 . should_equal "uat"
Test.expect_panic_with (Panic.catch Illegal_Argument.Error (Long.parseLong "foo") (_->"polyglot3")) JException
Test.expect_panic_with (Panic.catch Nothing (Long.parseLong 0) (_->"polyglot4")) Unsupported_Argument_Types.Error
Test.expect_panic_with (Panic.catch Illegal_Argument (Long.parseLong "foo") (_->"polyglot3")) JException
Test.expect_panic_with (Panic.catch Nothing (Long.parseLong 0) (_->"polyglot4")) Unsupported_Argument_Types
Test.specify "should be able to be recovered selectively" <|
Panic.recover Illegal_Argument.Error (Panic.throw (Illegal_Argument.Error "msg" Nothing)) . catch . should_be_an Illegal_Argument.Error
Panic.recover Illegal_Argument (Panic.throw (Illegal_Argument.Error "msg" Nothing)) . catch . should_be_an Illegal_Argument.Error
Panic.recover Any (Panic.throw (Illegal_Argument.Error "msg" Nothing)) . catch . should_be_an Illegal_Argument.Error
Panic.recover [Illegal_Argument.Error] (Panic.throw (Illegal_Argument.Error "msg" Nothing)) . catch . should_be_an Illegal_Argument.Error
Panic.recover [Illegal_State.Error, Illegal_Argument.Error] (Panic.throw (Illegal_Argument.Error "msg" Nothing)) . catch . should_be_an Illegal_Argument.Error
Panic.recover [Illegal_Argument] (Panic.throw (Illegal_Argument.Error "msg" Nothing)) . catch . should_be_an Illegal_Argument.Error
Panic.recover [Illegal_State, Illegal_Argument] (Panic.throw (Illegal_Argument.Error "msg" Nothing)) . catch . should_be_an Illegal_Argument.Error
Test.expect_panic_with <| Panic.recover Illegal_State.Error (Panic.throw (Illegal_Argument.Error "msg" Nothing)) . catch
Test.expect_panic_with <| Panic.recover [Illegal_State.Error] (Panic.throw (Illegal_Argument.Error "msg" Nothing)) . catch
Test.expect_panic_with <| Panic.recover Illegal_State (Panic.throw (Illegal_Argument.Error "msg" Nothing)) . catch
Test.expect_panic_with <| Panic.recover [Illegal_State] (Panic.throw (Illegal_Argument.Error "msg" Nothing)) . catch
Test.expect_panic_with <| Panic.recover [] (Panic.throw (Illegal_Argument.Error "msg" Nothing)) . catch
Panic.recover [JException] (do_a_parse "foo") . catch . should_be_a JException
@ -246,7 +246,7 @@ spec =
(err.payload.message) . should_equal "Cannot convert '42'(language: Java, type: java.lang.Long) to Java type 'java.lang.String': Invalid or lossy primitive coercion."
(err.payload.message) . should_equal (err.payload.to_display_text)
Panic.catch Unsupported_Argument_Types.Error (Long.decode 42) handler=check
Panic.catch Unsupported_Argument_Types (Long.decode 42) handler=check
Test.specify "should be able to throw and catch polyglot arrays" <|
handle_panic caught prefix="" =

View File

@ -28,7 +28,7 @@ spec =
Test.specify "should report missing method error on Java Arrays" <|
list = ArrayList.new
list.add 432
Test.expect_panic_with (list.asList) No_Such_Method.Error
Test.expect_panic_with (list.asList) No_Such_Method
Test.specify "should auto-convert numeric types across the polyglot boundary" <|
(Float.valueOf "123.3" + 5).should_equal 128.3 epsilon=0.0001
(Integer.sum 1 2 + 3) . should_equal 6

View File

@ -12,6 +12,7 @@ polyglot java import java.util.Locale as JavaLocale
from Standard.Test import Test, Test_Suite
import Standard.Test.Extensions
from Standard.Base.Error.Common import Uninitialized_State
import Standard.Base.Error.File_Error.File_Error
type My_Type
@foo (test_method)
@ -38,6 +39,10 @@ test_method a b = a + b
type Test_Type
Value x
type Sum_Type
Variant_A x
Variant_B y
spec =
Test.group "Meta-Value Manipulation" <|
Test.specify "should allow manipulating unresolved symbols" <|
@ -70,7 +75,7 @@ spec =
Test.specify "should allow manipulation of error values" <|
err = Error.throw "My Error"
meta_err = Meta.meta err
meta_err.is_a Meta.Error.Value . should_be_true
meta_err.is_a Meta.Error . should_be_true
meta_err.value . should_equal "My Error"
Test.specify "should allow checking if a value is of a certain type" <|
1.is_a Any . should_be_true
@ -106,8 +111,8 @@ spec =
Meta.is_a random_gen Random . should_be_true
Meta.is_a random_gen Integer . should_be_false
(My_Type.Value 1 "foo" Nothing).is_a My_Type.Value . should_be_true
(My_Type.Value 1 "foo" Nothing).is_a Test_Type.Value . should_be_false
(My_Type.Value 1 "foo" Nothing).is_a My_Type . should_be_true
(My_Type.Value 1 "foo" Nothing).is_a Test_Type . should_be_false
(My_Type.Value 1 "foo" Nothing).is_a Number . should_be_false
err = Error.throw "Error Value"
@ -125,6 +130,29 @@ spec =
Meta.is_a Date_Time.now.zone Time_Zone . should_be_true
Meta.is_a Date_Time.now.zone Date . should_be_false
Test.specify "constructor variants check" <|
(Sum_Type.Variant_A 42).is_a Sum_Type . should_be_true
(Sum_Type.Variant_A 42).is_a Sum_Type.Variant_A . should_be_false
(Sum_Type.Variant_A 42).is_a Sum_Type.Variant_B . should_be_false
Test.specify "constructor variants case of" <|
case (Sum_Type.Variant_A 42) of
_ : Sum_Type -> Nothing
e -> Test.fail "Expected "+e.to_text+" to be a Sum_Type"
Test.specify "constructor True check" <|
True . should_be_a True
True . should_be_a Boolean
Panic.recover Any (True . should_be_a False) . should_fail_with Any
Test.specify "constructor Case.Lower check" <|
Case.Lower . should_be_a Case.Lower
Case.Lower . should_be_a Case
Panic.recover Any (Case.Lower . should_be_a Case.Upper) . should_fail_with Any
Test.specify "5 isn't a constructor" <|
Panic.recover Any (5.should_be_a File_Error.Not_Found) . should_fail_with Any
Test.specify "should allow for returning the type of a value" <|
n_1 = Meta.type_of 42
n_1 . should_equal_type Integer
@ -173,7 +201,7 @@ spec =
Test.specify "should correctly handle Java values" <|
java_meta = Meta.meta Random.new
java_meta . should_be_a Meta.Polyglot.Value
java_meta . should_be_a Meta.Polyglot
java_meta . get_language . should_equal Meta.Language.Java
Test.specify "should correctly handle equality of Java values" <|
@ -192,7 +220,8 @@ spec =
Test.specify "get annotations" <|
Meta.get_annotation Meta_Spec "test_method" "a" . should_equal 7
Meta.get_annotation Meta_Spec "test_method" "b" . should_equal (Test_Type.Value 49)
Meta.get_annotation Meta_Spec "test_method" "c" . should_fail_with "Error Value"
Meta.get_annotation Meta_Spec "test_method" "c" . should_fail_with Text
Meta.get_annotation Meta_Spec "test_method" "c" . catch . should_equal "Error Value"
Meta.get_annotation Meta_Spec "test_method" "x" . should_equal Nothing
value = My_Type.Value 99 "bar" True
@ -238,7 +267,7 @@ spec =
atom.bar . should_equal 2
Test.specify "fail if atom_with_hole isn't used" <|
key = Panic.catch Uninitialized_State.Error handler=(caught_panic-> caught_panic.payload.key) <|
key = Panic.catch Uninitialized_State handler=(caught_panic-> caught_panic.payload.key) <|
Meta.atom_with_hole (_ -> My_Type.Value 1 2 3)
case key of
t : My_Type ->
@ -247,7 +276,7 @@ spec =
t.baz . should_equal 3
Test.specify "fail if non-atom is created" <|
key = Panic.catch Uninitialized_State.Error handler=(caught_panic-> caught_panic.payload.key) <|
key = Panic.catch Uninitialized_State handler=(caught_panic-> caught_panic.payload.key) <|
Meta.atom_with_hole (_ -> 2)
case key of
t : Number ->

View File

@ -13,7 +13,8 @@ spec =
Test.group "Auto_Detect" <|
Test.specify "should raise an error when reading an unknown file" <|
bytes = sample_xxx.read
bytes.should_fail_with File_Error.Unsupported_Type
bytes.should_fail_with File_Error
bytes.catch.should_be_a File_Error.Unsupported_Type
Test.specify "should be able to read a text file" <|
content = sample_txt.read
@ -70,6 +71,7 @@ spec =
Test.specify "should gracefully handle malformed files" <|
f1 = enso_project.data / "sample-malformed.json"
r1 = f1.read
r1.should_fail_with File_Error.Corrupted_Format
r1.should_fail_with File_Error
r1.catch.should_be_a File_Error.Corrupted_Format
main = Test_Suite.run_main spec

View File

@ -79,7 +79,9 @@ spec =
Test.specify "should handle exceptions when deleting a missing file" <|
file = File.new "does_not_exist.txt"
file.delete . should_fail_with File_Error.Not_Found
result = file.delete
result.should_fail_with File_Error
result.catch.should_be_a File_Error.Not_Found
if Platform.is_unix then
Test.specify "should allow to check file permissions" <|
@ -109,7 +111,8 @@ spec =
File_Permissions.Value [] [] []
r1 = f.read
r1.should_fail_with File_Error.Access_Denied
r1.should_fail_with File_Error
r1.catch.should_be_a File_Error.Access_Denied
r1.catch.file . should_equal f
r1.catch.to_display_text.should_contain "Insufficient permissions"
@ -139,8 +142,10 @@ spec =
Test.specify "should handle exceptions when reading a non-existent file" <|
file = File.new "does_not_exist.txt"
file.read_bytes . should_fail_with File_Error.Not_Found
non_existent_file.read_bytes . should_fail_with File_Error.Not_Found
file.read_bytes . should_fail_with File_Error
file.read_bytes.catch.should_be_a File_Error.Not_Found
non_existent_file.read_bytes . should_fail_with File_Error
non_existent_file.read_bytes.catch.should_be_a File_Error.Not_Found
Test.specify "should open and read the file in one shot" <|
path_name = sample_file.path
@ -180,9 +185,15 @@ spec =
Test.specify "should handle exceptions when reading a non-existent file" <|
file = File.new "does_not_exist.txt"
Data.read_text "does_not_exist.txt" . should_fail_with File_Error.Not_Found
file.read_text . should_fail_with File_Error.Not_Found
non_existent_file.read_text . should_fail_with File_Error.Not_Found
r1 = Data.read_text "does_not_exist.txt"
r1.should_fail_with File_Error
r1.catch.should_be_a File_Error.Not_Found
r2 = file.read_text
r2.should_fail_with File_Error
r2.catch.should_be_a File_Error.Not_Found
r3 = non_existent_file.read_text
r3.should_fail_with File_Error
r3.catch.should_be_a File_Error.Not_Found
Test.specify "should open and read the file in one shot" <|
path_name = sample_file.path
@ -250,8 +261,8 @@ spec =
f = transient / "work.txt"
f.delete_if_exists
f.exists.should_be_false
[0, 1, 256].write_bytes f . should_fail_with Illegal_Argument.Error
[0, 1, Nothing].write_bytes f . should_fail_with Illegal_Argument.Error
[0, 1, 256].write_bytes f . should_fail_with Illegal_Argument
[0, 1, Nothing].write_bytes f . should_fail_with Illegal_Argument
Test.specify "should not change the file when trying to write an invalid byte vector" <|
f = transient / "work.txt"
@ -259,12 +270,12 @@ spec =
f_bak = transient / "work.txt.bak"
f_bak.delete_if_exists
Problems.assume_no_problems <| data.write_bytes f
[0, 1, 256].write_bytes f . should_fail_with Illegal_Argument.Error
[0, 1, 256].write_bytes f . should_fail_with Illegal_Argument
f.read_bytes.should_equal data
f_bak.exists.should_be_false
[0, 1, 256].write_bytes f on_existing_file=Existing_File_Behavior.Overwrite . should_fail_with Illegal_Argument.Error
[0, 1, 256].write_bytes f on_existing_file=Existing_File_Behavior.Overwrite . should_fail_with Illegal_Argument
f.read_bytes.should_equal data
[0, 1, 256].write_bytes f on_existing_file=Existing_File_Behavior.Append . should_fail_with Illegal_Argument.Error
[0, 1, 256].write_bytes f on_existing_file=Existing_File_Behavior.Append . should_fail_with Illegal_Argument
f.read_bytes.should_equal data
f.delete_if_exists
@ -308,7 +319,9 @@ spec =
"line 1!".write f on_existing_file=Existing_File_Behavior.Error on_problems=Report_Error . should_succeed . should_equal f
f.exists.should_be_true
f.read_text.should_equal "line 1!"
"line 2!".write f on_existing_file=Existing_File_Behavior.Error . should_fail_with File_Error.Already_Exists
r1 = "line 2!".write f on_existing_file=Existing_File_Behavior.Error
r1.should_fail_with File_Error
r1.catch.should_be_a File_Error.Already_Exists
f.read_text.should_equal "line 1!"
f.delete
f.exists.should_be_false
@ -351,7 +364,7 @@ spec =
new_file = transient / "work.txt.new"
[bak_file, new_file].each .delete_if_exists
result = Panic.catch Illegal_State.Error handler=(caught_panic-> caught_panic.payload.message) <|
result = Panic.catch Illegal_State handler=(caught_panic-> caught_panic.payload.message) <|
Existing_File_Behavior.Backup.write f output_stream->
output_stream.write_bytes "foo".utf_8
Panic.throw (Illegal_State.Error "baz")
@ -365,7 +378,7 @@ spec =
Test.fail "The temporary file should have been cleaned up."
f.delete
result2 = Panic.catch Illegal_State.Error handler=(caught_panic-> caught_panic.payload.message) <|
result2 = Panic.catch Illegal_State handler=(caught_panic-> caught_panic.payload.message) <|
Existing_File_Behavior.Backup.write f output_stream->
output_stream.write_bytes "foo".utf_8
Panic.throw (Illegal_State.Error "baz")
@ -385,7 +398,7 @@ spec =
result3 = Existing_File_Behavior.Backup.write f output_stream->
output_stream.write_bytes "foo".utf_8
Error.throw (Illegal_State.Error "HMM...")
result3.should_fail_with Illegal_State.Error
result3.should_fail_with Illegal_State
result3.catch.message . should_equal "HMM..."
f.read_text . should_equal "OLD"
if bak_file.exists then
@ -397,7 +410,7 @@ spec =
result4 = Existing_File_Behavior.Backup.write f output_stream->
output_stream.write_bytes "foo".utf_8
Error.throw (Illegal_State.Error "HMM...")
result4.should_fail_with Illegal_State.Error
result4.should_fail_with Illegal_State
result4.catch.message . should_equal "HMM..."
if f.exists.not then
Test.fail "Since we were writing to the original destination, the partially written file should have been preserved even upon failure."
@ -410,6 +423,7 @@ spec =
Test.specify "should respect file access permissions and fail with an error if denied, in all modes" <|
f = transient / "permissions3.txt"
if f.exists then set_writable f True
f.delete_if_exists
"foobar".write f on_existing_file=Existing_File_Behavior.Overwrite
@ -419,15 +433,18 @@ spec =
f.is_writable.should_be_false
r2 = "FOO".write f on_existing_file=Existing_File_Behavior.Append
r2.should_fail_with File_Error.Access_Denied
r2.should_fail_with File_Error
r2.catch.should_be_a File_Error.Access_Denied
f.read . should_equal "foobar"
r3 = "FOO".write f on_existing_file=Existing_File_Behavior.Overwrite
r3.should_fail_with File_Error.Access_Denied
r3.should_fail_with File_Error
r3.catch.should_be_a File_Error.Access_Denied
f.read . should_equal "foobar"
r4 = "FOO".write f on_existing_file=Existing_File_Behavior.Backup
r4.should_fail_with File_Error.Access_Denied
r4.should_fail_with File_Error
r4.catch.should_be_a File_Error.Access_Denied
f.read . should_equal "foobar"
f.is_writable.should_be_false
@ -441,11 +458,14 @@ spec =
f = parent / "foo.txt"
r1 = "txt".write f
r1.should_fail_with File_Error.Not_Found
r1.should_fail_with File_Error
r1.catch.should_be_a File_Error.Not_Found
# The write fails because the _parent_ directory did not exist.
r1.catch.file . should_equal parent
[65, 67].write_bytes f . should_fail_with File_Error.Not_Found
r2 = [65, 67].write_bytes f
r2.should_fail_with File_Error
r2.catch.should_be_a File_Error.Not_Found
Test.specify "should warn about not-encodable characters according to the problem behaviour" <|
f = transient / "encoding-errors.txt"

View File

@ -11,7 +11,7 @@ import Standard.Visualization.File_Upload.File_Being_Uploaded
spec = Test.group "File uploads" <|
Test.specify "should be able to be signalled as uploading" <|
Visualization.file_uploading "file" . should_fail_with File_Being_Uploaded.Value
Visualization.file_uploading "file" . should_fail_with File_Being_Uploaded
Test.specify "should work whether a textual or file path is provided" <|
result_file = Visualization.file_uploading Examples.csv . catch