Tidy up the remaining ones except Base... (#3797)

- Removed `Dubious constructor export` from Examples, Geo, Google_Api, Image and Test.
- Updated Google_Api project to meet newer code standards.
- Restructured `Standard.Test`:
- `Main.enso` now exports `Bench`, `Faker`, `Problems`, `Test`, `Test_Suite`
- `Test.Suite` methods moved into a `Test_Suite` type.
- Moved `Bench.measure` into `Bench` type.
- Separated the reporting to a `Test_Reporter` module.
- Moved `Faker` methods into `Faker` type.
- Removed `Verbs` and `.should` method.
- Added `should_start_with` and `should_contain` extensions to `Any`.
- Restructured `Standard.Image`:
- Merged Codecs methods into `Image`.
- Export `Image`, `Read_Flag`, `Write_Flag` and `Matrix` as types from `Main.enso`.
- Merged the internal methods into `Matrix` and `Image`.
- Fixed `Day_Of_Week` to be exported as a type and sort the `from` method.
This commit is contained in:
James Dunkerley 2022-10-17 12:27:27 +01:00 committed by GitHub
parent 47148a2ff1
commit 701c644d0e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
159 changed files with 1767 additions and 1856 deletions

View File

@ -2,10 +2,6 @@ from Standard.Base import all
polyglot java import java.time.DayOfWeek
# TODO Dubious constructor export
from project.Data.Time.Day_Of_Week.Day_Of_Week import all
from project.Data.Time.Day_Of_Week.Day_Of_Week export all
type Day_Of_Week
Sunday
@ -27,17 +23,17 @@ type Day_Of_Week
- `first_day`: The first day of the week.
- `start_at_zero`: If True, first day of the week is 0 otherwise is 1.
to_integer : Day_Of_Week -> Boolean -> Integer
to_integer self first_day=Sunday start_at_zero=False =
to_integer self first_day=Day_Of_Week.Sunday start_at_zero=False =
day_number = case self of
Sunday -> 0
Monday -> 1
Tuesday -> 2
Wednesday -> 3
Thursday -> 4
Friday -> 5
Saturday -> 6
Day_Of_Week.Sunday -> 0
Day_Of_Week.Monday -> 1
Day_Of_Week.Tuesday -> 2
Day_Of_Week.Wednesday -> 3
Day_Of_Week.Thursday -> 4
Day_Of_Week.Friday -> 5
Day_Of_Week.Saturday -> 6
shifted = if first_day == Sunday then day_number else
shifted = if first_day == Day_Of_Week.Sunday then day_number else
(day_number + 7 - (first_day.to_integer start_at_zero=True)) % 7
shifted + if start_at_zero then 0 else 1
@ -45,30 +41,10 @@ type Day_Of_Week
## PRIVATE
to_java : DayOfWeek
to_java self = case self of
Sunday -> DayOfWeek.SUNDAY
Monday -> DayOfWeek.MONDAY
Tuesday -> DayOfWeek.TUESDAY
Wednesday -> DayOfWeek.WEDNESDAY
Thursday -> DayOfWeek.THURSDAY
Friday -> DayOfWeek.FRIDAY
Saturday -> DayOfWeek.SATURDAY
## Convert from an integer to a Day_Of_Week
Arguments:
- `that`: The first day of the week.
- `first_day`: The first day of the week.
- `start_at_zero`: If True, first day of the week is 0 otherwise is 1.
from (that : Integer) (first_day:Day_Of_Week=Sunday) (start_at_zero:Boolean=False) =
shifted = if start_at_zero then that else that - 1
case (shifted < 0) || (shifted > 6) of
True ->
valid_range = if start_at_zero then "0-6" else "1-7"
message = "Invalid day of week (must be " + valid_range + ")."
Error.throw (Illegal_Argument_Error message)
False ->
day_number = if first_day == Sunday then shifted else
(shifted + (first_day.to_integer start_at_zero=True)) % 7
[Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday].at day_number
Day_Of_Week.Sunday -> DayOfWeek.SUNDAY
Day_Of_Week.Monday -> DayOfWeek.MONDAY
Day_Of_Week.Tuesday -> DayOfWeek.TUESDAY
Day_Of_Week.Wednesday -> DayOfWeek.WEDNESDAY
Day_Of_Week.Thursday -> DayOfWeek.THURSDAY
Day_Of_Week.Friday -> DayOfWeek.FRIDAY
Day_Of_Week.Saturday -> DayOfWeek.SATURDAY

View File

@ -0,0 +1,23 @@
from Standard.Base import all
import project.Data.Time.Day_Of_Week.Day_Of_Week
## Convert from an integer to a Day_Of_Week
Arguments:
- `that`: The first day of the week.
- `first_day`: The first day of the week.
- `start_at_zero`: If True, first day of the week is 0 otherwise is 1.
Day_Of_Week.from (that : Integer) (first_day:Day_Of_Week=Day_Of_Week.Sunday) (start_at_zero:Boolean=False) =
shifted = if start_at_zero then that else that - 1
case (shifted < 0) || (shifted > 6) of
True ->
valid_range = if start_at_zero then "0-6" else "1-7"
message = "Invalid day of week (must be " + valid_range + ")."
Error.throw (Illegal_Argument_Error message)
False ->
day_number = if first_day == Day_Of_Week.Sunday then shifted else
(shifted + (first_day.to_integer start_at_zero=True)) % 7
[Day_Of_Week.Sunday, Day_Of_Week.Monday, Day_Of_Week.Tuesday, Day_Of_Week.Wednesday, Day_Of_Week.Thursday, Day_Of_Week.Friday, Day_Of_Week.Saturday].at day_number

View File

@ -33,7 +33,8 @@ import project.Data.Time.Date
import project.Data.Time.Date_Time
import project.Data.Time.Time_Of_Day
import project.Data.Time.Time_Zone
import project.Data.Time.Day_Of_Week
import project.Data.Time.Day_Of_Week.Day_Of_Week
import project.Data.Time.Day_Of_Week_From
import project.Data.Vector
import project.Error.Common
import project.Error.Problem_Behavior
@ -77,7 +78,8 @@ export project.Data.Time.Date
export project.Data.Time.Date_Time
export project.Data.Time.Time_Of_Day
export project.Data.Time.Time_Zone
export project.Data.Time.Day_Of_Week
export project.Data.Time.Day_Of_Week.Day_Of_Week
export project.Data.Time.Day_Of_Week_From
export project.Data.Vector
export project.Error.Problem_Behavior
export project.IO

View File

@ -8,20 +8,14 @@ import Standard.Base.Data.Text.Regex.Engine.Default as Default_Engine
from Standard.Table import Table, Column
import Standard.Image
import Standard.Image.Codecs
import Standard.Image.Data.Matrix
# TODO Dubious constructor export
from project.Main.Example_Error_Type import all
from project.Main.Example_Error_Type export all
from Standard.Image import Image, Read_Flag, Matrix
## An example error type used in a number of examples.
Arguments:
- message: The message contained in the error type.
type Example_Error_Type
Example_Error_Type_Data message
Error message
## The standard library data directory.
data_dir : File
@ -126,21 +120,17 @@ type No_Methods
no_such_method : No_Such_Method_Error
no_such_method = Panic.recover Any No_Methods.frobnicate . catch
# TODO Dubious constructor export
from project.Main.My_Error import all
from project.Main.My_Error export all
## A simple error type for example purposes.
type My_Error
My_Error_Data message
Error message
## Throws an error.
throw_error : Nothing ! My_Error
throw_error = Error.throw <| My_Error_Data "Example error."
throw_error = Error.throw <| My_Error.Error "Example error."
## Throws a panic.
throw_panic : Nothing
throw_panic = Panic.throw <| My_Error_Data "Example panic."
throw_panic = Panic.throw <| My_Error.Error "Example panic."
## A URL for open-source geographic data about the locations of bus-stop ads in
Los Angeles.
@ -193,11 +183,11 @@ image_file =
the internet if it is not already present on your disk. If you do not want
this to happen, please place the image in the
`lib/Standard/Examples/<version>/data` folder for your Enso distribution.
image : Image.Image
image = Image.read image_file [Codecs.Read_Alpha_Channel]
image : Image
image = Image.read image_file [Read_Flag.Alpha_Channel]
## A matrix that corresponds to `image`.
matrix : Matrix.Matrix
matrix : Matrix
matrix = image.to_matrix
## A silly little function that adds one to the provided number.

View File

@ -1,9 +1,5 @@
from Standard.Base import all
# TODO Dubious constructor export
from project.Geo_Json.Object_Type import all
from project.Geo_Json.Object_Type export all
## PRIVATE
A type of GeoJSON object.
@ -24,8 +20,8 @@ type Object_Type
Convert GeoJSON object type to Text.
to_text : Text
to_text self = case self of
Feature -> "Feature"
Feature_Collection -> "FeatureCollection"
Object_Type.Feature -> "Feature"
Object_Type.Feature_Collection -> "FeatureCollection"
## PRIVATE

View File

@ -11,22 +11,22 @@ polyglot java import com.google.api.services.sheets.v4.Sheets
## PRIVATE
type Google_Api_Client
## PRIVATE
type Google_Api_Client credential json_factory http_transport
Value credential json_factory http_transport
## Accesses a service responsible for working with Google Spreadsheets.
Arguments:
- app_name: the application name to use for making the API calls. This
will show up in access logs etc.
spreadsheets : Text -> Spreadsheets_Service
spreadsheets : Text -> Spreadsheets
spreadsheets self app_name='Enso' =
service = Sheets.Builder.new self.http_transport self.json_factory self.credential . setApplicationName app_name . build
Spreadsheets_Service service
Spreadsheets.Service service
## PRIVATE
type Spreadsheets_Service
type Spreadsheets
## PRIVATE
type Spreadsheets_Service java_service
Service java_service
## Gets a table with the given ID and sheet range.
@ -56,5 +56,5 @@ initialize secret_file =
GoogleCredential.fromStream is . createScoped (Collections.singleton SheetsScopes.SPREADSHEETS)
http_transport = GoogleNetHttpTransport.newTrustedTransport
json_factory = GsonFactory.getDefaultInstance
Google_Api_Client credential json_factory http_transport
Google_Api_Client.Value credential json_factory http_transport

View File

@ -1,161 +0,0 @@
from Standard.Base import all
import Standard.Image.Codecs.Internal
import Standard.Image.Data.Image
polyglot java import org.enso.image.Codecs as Java_Codecs
## UNSTABLE
Read an image from a file.
The functon reads images in RGB format, or RGBA if the
`Read_Alpha_Channel` flag is specified.
Arguments:
- location: the file to read.
- flags: the read flags.
> Example
Read the image.
Codecs.read "image.png"
> Example
Read the image with alpha channel.
Codecs.read "image.png" Codecs.Read_Alpha_Channel
> Example
Read the image and convert it to grayscale.
Codecs.read "image.png" Codecs.Read_Grayscale
read : (Text | File) -> (Read_Flag | Vector) -> Image ! File.IO_Error
read location flags=[] =
path = case location of
_ : File.File -> location.path
_ -> location
read_flags = case flags of
_ : Vector.Vector ->
if flags.is_empty then Java_Codecs.READ_FLAG_EMPTY else
flags.map .to_integer . reduce (_.bit_or _)
_ -> flags.to_integer
Panic.catch_java Any (Image.Image_Data (Java_Codecs.read path read_flags)) _->
Error.throw (File.IO_Error (File.new path) 'Failed to read the file')
## UNSTABLE
Write an image to a file.
Arguments:
- location: The location to write the image to.
- flags: A vector of flags that control how the image is written.
> Example
Write the image with applying png compression.
Codecs.write path image
> Example
Write the image with applying png compression.
Codecs.write path image (Codecs.Write_Png_Compression 9)
> Example
Write the image with applying several flags.
Codecs.write path image [Codecs.Write_Jpeg_Quality 40, Codecs.Write_Jpeg_Progressive]
Image.Image.write : (Text | File) -> (Write_Flag | Vector) -> Nothing ! File.IO_Error
Image.Image.write self location flags=[] =
path = case location of
_ : File.File -> location.path
_ -> location
write_flags = case flags of
_ : Vector.Vector -> flags
_ -> [flags]
int_flags = Internal.mat_of_int (write_flags.flat_map x-> [x.to_integer, x.value])
Panic.catch_java Any (Java_Codecs.write path self.opencv_mat int_flags) _->
Error.throw (File.IO_Error (File.new path) 'Failed to write to the file')
# TODO Dubious constructor export
from project.Codecs.Read_Flag import all
from project.Codecs.Read_Flag export all
## UNSTABLE
type Read_Flag
## UNSTABLE
Read the image with its alpha channel, otherwise the channel gets cropped.
Read_Alpha_Channel
## UNSTABLE
Always convert the image to a single channel grayscale image.
Read_Grayscale
## UNSTABLE
Use Geographic Data Abstraction Library (GDAL) driver to load images in
geospatial raster data formats.
Read_Gdal
# TODO Dubious constructor export
from project.Codecs.Write_Flag import all
from project.Codecs.Write_Flag export all
## UNSTABLE
type Write_Flag
## UNSTABLE
Sets the quality used when writing a JPEG.
Arguments:
- val: A quality value from 0 to 100 (the higher, the better).
Write_Jpeg_Quality val=95
## UNSTABLE
Enable progressive JPEG compression format. Disabled by default.
Write_Jpeg_Progressive
## UNSTABLE
Enable optimized JPEG encoding algorithms. Disabled by default.
Write_Jpeg_Optimize
## UNSTABLE
Sets the luma quality level used when writing a JPEG.
Arguments:
- val: A quality value from 0 to 100 (the higher, the better).
Write_Jpeg_Luma_Quality val=0
## UNSTABLE
Sets the chroma quality level used when writing a JPEG.
Arguments:
- val: A quality value from 0 to 100 (the higher, the better).
Write_Jpeg_Chroma_Quality val=0
## UNSTABLE
Sets the compression level used when writing a PNG.
Arguments:
- val: A compression level from 0 to 9. A higher value means a smaller
size but a longer compression time.
Write_Png_Compression val=3
## UNSTABLE
Sets the quality used when writing a WEBP image.
Arguments:
- val: A quality from 0 to 100 (the higher, the better). A quality
above 100 indicates that the encoder should use lossless compression.
Write_Webp_Quality val=101
## PRIVATE
value self = case self of
Write_Jpeg_Progressive -> 1
Write_Jpeg_Optimize -> 1
_ -> self.val

View File

@ -1,28 +0,0 @@
from Standard.Base import all
import Standard.Image.Codecs
polyglot java import org.opencv.core.MatOfInt
polyglot java import org.opencv.imgcodecs.Imgcodecs
## PRIVATE
Codecs.Read_Flag.to_integer self = case self of
Codecs.Read_Alpha_Channel -> Imgcodecs.IMREAD_UNCHANGED
Codecs.Read_Grayscale -> Imgcodecs.IMREAD_GRAYSCALE
Codecs.Read_Gdal -> Imgcodecs.IMREAD_LOAD_GDAL
## PRIVATE
Codecs.Write_Flag.to_integer self = case self of
Codecs.Write_Jpeg_Quality _ -> Imgcodecs.IMWRITE_JPEG_QUALITY
Codecs.Write_Jpeg_Progressive -> Imgcodecs.IMWRITE_JPEG_PROGRESSIVE
Codecs.Write_Jpeg_Optimize -> Imgcodecs.IMWRITE_JPEG_OPTIMIZE
Codecs.Write_Jpeg_Luma_Quality _ -> Imgcodecs.IMWRITE_JPEG_LUMA_QUALITY
Codecs.Write_Jpeg_Chroma_Quality _ -> Imgcodecs.IMWRITE_JPEG_CHROMA_QUALITY
Codecs.Write_Png_Compression _ -> Imgcodecs.IMWRITE_PNG_COMPRESSION
Codecs.Write_Webp_Quality _ -> Imgcodecs.IMWRITE_WEBP_QUALITY
## PRIVATE
Create an OpenCV matrix.
mat_of_int : Vector Any -> MatOfInt
mat_of_int values = MatOfInt.new values.to_array

View File

@ -1,14 +1,5 @@
from Standard.Base import all
import Standard.Image.Data.Image
polyglot java import org.enso.image.data.Histogram as Java_Histogram
# TODO Dubious constructor export
from project.Data.Histogram.Histogram import all
from project.Data.Histogram.Histogram export all
## UNSTABLE
type Histogram
@ -19,7 +10,7 @@ type Histogram
Arguments:
- channel: The channel in the image for which this is a histogram.
- data: The histogram data.
Histogram_Data channel data
Value channel data
## UNSTABLE
@ -29,7 +20,6 @@ type Histogram
Convert a histogram to JSON.
import Standard.Examples
import Standard.Image
example_to_json =
histo = Examples.image.histogram 0
@ -38,22 +28,3 @@ type Histogram
to_json self =
bins = Json.from_pairs [["bins", self.data]]
Json.from_pairs [["data", bins]]
## UNSTABLE
Create a histogram for the specified channel of the image.
Arguments:
- channel: the channel number.
> Example
Create a histogram.
import Standard.Examples
import Standard.Image
example_histogram = Examples.image.histogram 0
Image.Image.histogram : Integer -> Histogram
Image.Image.histogram self channel =
hist = Java_Histogram.calculate self.opencv_mat channel
Histogram_Data channel (Vector.from_polyglot_array hist.get_data)

View File

@ -1,10 +1,18 @@
from Standard.Base import all
import Standard.Image.Data.Image.Internal
import Standard.Image.Data.Matrix
import project.Data.Histogram.Histogram
import project.Data.Matrix.Matrix
import project.Data.Matrix_Error.Matrix_Error
polyglot java import org.enso.image.data.Histogram as Java_Histogram
polyglot java import org.enso.image.data.Image as Java_Image
polyglot java import org.enso.image.Codecs as Java_Codecs
polyglot java import org.opencv.core.MatOfInt
polyglot java import org.opencv.core.Mat
polyglot java import org.opencv.core.Scalar
## UNSTABLE
type Image
## UNSTABLE
Create an image from the array of values.
@ -20,20 +28,79 @@ polyglot java import org.enso.image.data.Image as Java_Image
> Example
Create an image from the vector.
import Standard.Image
from Standard.Image import Image
example_from_vector =
Image.from_vector [0, 0, 0, 0, 0, 0] rows=2 channels=1
from_vector : Vector -> Integer -> Integer -> Image
from_vector values rows=1 channels=1 =
Image_Data (Java_Image.from_vector values.to_array rows channels)
# TODO Dubious constructor export
from project.Data.Image.Image import all
from project.Data.Image.Image export all
Image.Value (Java_Image.from_vector values.to_array rows channels)
## UNSTABLE
type Image
Read an image from a file.
The function reads images in RGB format, or RGBA if the
`Read_Flag.Alpha_Channel` flag is specified.
Arguments:
- location: the file to read.
- flags: the read flags.
> Example
Read the image.
Image.read "image.png"
> Example
Read the image with alpha channel.
Image.read "image.png" Read_Flag.Alpha_Channel
> Example
Read the image and convert it to grayscale.
Image.read "image.png" Read_Flag.Grayscale
read : (Text | File) -> (Read_Flag | Vector) -> Image ! File.IO_Error
read location flags=[] =
path = case location of
_ : File.File -> location.path
_ -> location
read_flags = case flags of
_ : Vector.Vector ->
if flags.is_empty then Java_Codecs.READ_FLAG_EMPTY else
flags.map .to_integer . reduce (_.bit_or _)
_ -> flags.to_integer
Panic.catch_java Any (Image.Value (Java_Codecs.read path read_flags)) _->
Error.throw (File.IO_Error (File.new path) 'Failed to read the file')
## UNSTABLE
Write an image to a file.
Arguments:
- location: The location to write the image to.
- flags: A vector of flags that control how the image is written.
> Example
Write the image with applying png compression.
image.write path image
> Example
Write the image with applying png compression.
image.write path image (Write_Flag.PNG_Compression 9)
> Example
Write the image with applying several flags.
image.write path image [Write_Flag.JPEG_Quality 40, Write_Flag.JPEG_Progressive]
write : (Text | File) -> (Write_Flag | Vector) -> Nothing ! File.IO_Error
write self location flags=[] =
path = case location of
_ : File.File -> location.path
_ -> location
write_flags = case flags of
_ : Vector.Vector -> flags
_ -> [flags]
int_flags = MatOfInt.new (write_flags.flat_map x-> [x.to_integer, x.value]).to_array
Panic.catch_java Any (Java_Codecs.write path self.opencv_mat int_flags) _->
Error.throw (File.IO_Error (File.new path) 'Failed to write to the file')
## UNSTABLE
@ -45,7 +112,7 @@ type Image
The image is represented with a matrix of rows x columns. Each
pixel is represented with a vector of 1 to 4 values (channels).
Pixel values are normalized in a range [0.0 .. 1.0].
Image_Data opencv_mat
Value opencv_mat
## UNSTABLE
@ -100,10 +167,10 @@ type Image
import Standard.Examples
example_get = Examples.image.get 10 10
get : Integer -> Integer -> Vector ! Matrix.Index_Out_Of_Bounds_Error
get : Integer -> Integer -> Vector ! Matrix_Error
get self row column =
if (row < 0) || (row >= self.rows) then Error.throw (Matrix.Index_Out_Of_Bounds_Error self.rows self.columns row) else
if (column < 0) || (column >= self.columns) then Error.throw (Matrix.Index_Out_Of_Bounds_Error self.rows self.columns column) else
if (row < 0) || (row >= self.rows) then Error.throw (Matrix_Error.Index_Out_Of_Bounds_Error self.rows self.columns row) else
if (column < 0) || (column >= self.columns) then Error.throw (Matrix_Error.Index_Out_Of_Bounds_Error self.rows self.columns column) else
arr = Java_Image.get self.opencv_mat row column
Vector.from_polyglot_array arr
@ -150,13 +217,13 @@ type Image
Add a matrix to the image.
import Standard.Examples
import Standard.Image.Data.Matrix
from Standard.Image import Matrix
example_plus =
image = Examples.image
image + (Matrix.zeros rows=image.rows columns=image.columns channels=image.channels)
+ : (Number | Vector | Matrix) -> Image ! Matrix.Dimensions_Not_Equal
+ self value = Panic.recover Any (Internal.core_op self.opencv_mat value (Java_Image.add _ _ _)) . catch Any Internal.core_op_handler
+ : (Number | Vector | Matrix) -> Image ! Matrix_Error
+ self value = Panic.recover Any (core_op self.opencv_mat value (Java_Image.add _ _ _)) . catch Any core_op_handler
## UNSTABLE
@ -201,13 +268,13 @@ type Image
Subtract a matrix from the image.
import Standard.Examples
import Standard.Image.Data.Matrix
from Standard.Image import Matrix
example_minus =
image = Examples.image
image - (Matrix.zeros rows=image.rows columns=image.columns channels=image.channels)
- : (Number | Vector | Matrix) -> Image ! Matrix.Dimensions_Not_Equal
- self value = Panic.recover Any (Internal.core_op self.opencv_mat value (Java_Image.subtract _ _ _)) . catch Any Internal.core_op_handler
- : (Number | Vector | Matrix) -> Image ! Matrix_Error
- self value = Panic.recover Any (core_op self.opencv_mat value (Java_Image.subtract _ _ _)) . catch Any core_op_handler
## UNSTABLE
@ -252,13 +319,13 @@ type Image
Multiply a matrix and the image.
import Standard.Examples
import Standard.Image.Data.Matrix
from Standard.Image import Matrix
example_mul =
image = Examples.image
image * (Matrix.ones rows=image.rows columns=image.columns channels=image.channels)
* : (Number | Vector | Matrix) -> Image ! Matrix.Dimensions_Not_Equal
* self value = Panic.recover Any (Internal.core_op self.opencv_mat value (Java_Image.multiply _ _ _)) . catch Any Internal.core_op_handler
* : (Number | Vector | Matrix) -> Image ! Matrix_Error
* self value = Panic.recover Any (core_op self.opencv_mat value (Java_Image.multiply _ _ _)) . catch Any core_op_handler
## UNSTABLE
@ -303,13 +370,13 @@ type Image
Divide an image by a matrix.
import Standard.Examples
import Standard.Image.Data.Matrix
from Standard.Image import Matrix
example_div =
image = Examples.image
image / (Matrix.ones rows=image.rows columns=image.columns channels=image.channels)
/ : (Number | Vector | Matrix) -> Image ! Matrix.Dimensions_Not_Equal
/ self value = Panic.recover Any (Internal.core_op self.opencv_mat value (Java_Image.divide _ _ _)) . catch Any Internal.core_op_handler
/ : (Number | Vector | Matrix) -> Image ! Matrix_Error
/ self value = Panic.recover Any (core_op self.opencv_mat value (Java_Image.divide _ _ _)) . catch Any core_op_handler
## UNSTABLE
@ -378,3 +445,53 @@ type Image
to_matrix : Matrix
to_matrix self = Matrix.from_vector self.to_vector self.rows self.channels
## UNSTABLE
Create a histogram for the specified channel of the image.
Arguments:
- channel: the channel number.
> Example
Create a histogram.
import Standard.Examples
example_histogram = Examples.image.histogram 0
histogram : Integer -> Histogram
histogram self channel =
hist = Java_Histogram.calculate self.opencv_mat channel
Histogram.Value channel (Vector.from_polyglot_array hist.get_data)
## PRIVATE
Apply a core matrix operation.
Arguments:
- mat: The matrix to operate on.
- value: The value to apply to the matrix.
- function: The function with which to apply `value` to `mat`.
core_op : Mat -> Any -> (Mat -> Scalar -> Mat -> Nothing) -> Nothing
core_op mat value function =
result = Mat.new
scalar = case value of
_ : Vector.Vector ->
Scalar.new value.to_array
Matrix.Value m ->
if ((m.rows == mat.rows) && (m.cols == mat.cols) && (m.channels == mat.channels)) then m else Panic.throw Matrix_Error.Dimensions_Not_Equal
_ ->
Scalar.all value
function mat scalar result
Image.Value result
## PRIVATE
Handles errors in `core_op`.
Arguments:
- error: The value to throw as an error.
core_op_handler : Any
core_op_handler error =
case error of
Matrix_Error.Dimensions_Not_Equal -> Error.throw error
_ -> Panic.throw error

View File

@ -1,42 +0,0 @@
from Standard.Base import all
import Standard.Image.Data.Image
import Standard.Image.Data.Matrix
polyglot java import org.enso.image.data.Image as Java_Image
polyglot java import org.opencv.core.Mat
polyglot java import org.opencv.core.Scalar
## PRIVATE
Apply a core matrix operation.
Arguments:
- mat: The matrix to operate on.
- value: The value to apply to the matrix.
- function: The function with which to apply `value` to `mat`.
core_op : Mat -> Any -> (Mat -> Scalar -> Mat -> Nothing) -> Nothing
core_op mat value function =
result = Mat.new
scalar = case value of
_ : Vector.Vector ->
Scalar.new value.to_array
Matrix.Matrix_Data m ->
if ((m.rows == mat.rows) && (m.cols == mat.cols) && (m.channels == mat.channels)) then m else Panic.throw Matrix.Dimensions_Not_Equal
_ ->
Scalar.all value
function mat scalar result
Image.Image_Data result
## PRIVATE
Handles errors in `core_op`.
Arguments:
- error: The value to throw as an error.
core_op_handler : Any
core_op_handler error =
case error of
Matrix.Dimensions_Not_Equal -> Error.throw error
_ -> Panic.throw error

View File

@ -1,89 +1,12 @@
from Standard.Base import all hiding Index_Out_Of_Bounds_Error
from Standard.Base import all
from Standard.Base import all
import Standard.Image.Data.Histogram
import Standard.Image.Data.Image
import Standard.Image.Data.Matrix.Internal
import project.Data.Image.Image
import project.Data.Matrix_Error.Matrix_Error
polyglot java import org.enso.image.data.Matrix as Java_Matrix
## UNSTABLE
Create a matrix with all elements set to zero.
Arguments:
- rows: the number of rows in the resulting matrix.
- columns: the number of columns in the resulitng matrix.
- channels: the number of channels in the resulting matrix.
> Example
Create a matrix.
import Standard.Image.Data.Matrix
example_zeros = Matrix.zeros rows=2 columns=2
zeros : Integer -> Integer -> Integer -> Matrix
zeros rows columns channels=1 =
Matrix_Data (Java_Matrix.zeros rows columns channels)
## UNSTABLE
Create a matrix with all elements set to one.
Arguments:
- rows: the number of rows in the resulting matrix.
- columns: the number of columns in the resulitng matrix.
- channels: the number of channels in the resulting matrix.
> Example
Create a matrix.
import Standard.Image.Data.Matrix
example_ones = Matrix.zeros rows=2 columns=2 channels=3
ones : Integer -> Integer -> Integer -> Matrix
ones rows columns channels=1 =
Matrix_Data (Java_Matrix.ones rows columns channels)
## UNSTABLE
Create an identity matrix containing ones on a main diagonal.
Arguments:
- rows: the number of rows in the resulting matrix.
- columns: the number of columns in the resulitng matrix.
- channels: the number of channels in the resulting matrix.
> Example
Create a matrix.
import Standard.Image.Data.Matrix
example_identity = Matrix.identity rows=2 columns=2 channels=3
identity : Integer -> Integer -> Integer -> Matrix
identity rows columns channels=1 =
Matrix_Data (Java_Matrix.identity rows columns channels)
## UNSTABLE
Create a matrix from the provided vector.
Arguments:
- values: the vector of numbers.
- rows: the number of rows in the resulting matrix.
- channels: the number of channels in the resulting matrix.
> Example
Create a matrix.
import Standard.Image.Data.Matrix
example_from_vector = Matrix.from_vector [1, 1, 0, 0] rows=2
from_vector : Vector -> Integer -> Integer -> Matrix
from_vector values rows=1 channels=1 =
Matrix_Data (Java_Matrix.from_vector values.to_array channels rows)
# TODO Dubious constructor export
from project.Data.Matrix.Matrix import all
from project.Data.Matrix.Matrix export all
polyglot java import org.opencv.core.Mat
polyglot java import org.opencv.core.Scalar
## UNSTABLE
type Matrix
@ -98,7 +21,82 @@ type Matrix
Each value of the matrix is represented with an array of
channels. In contrast to an Image data type, Matrix values are
not normalized.
Matrix_Data opencv_mat
Value opencv_mat
## UNSTABLE
Create a matrix with all elements set to zero.
Arguments:
- rows: the number of rows in the resulting matrix.
- columns: the number of columns in the resulting matrix.
- channels: the number of channels in the resulting matrix.
> Example
Create a matrix.
from Standard.Image import Matrix
example_zeros = Matrix.zeros rows=2 columns=2
zeros : Integer -> Integer -> Integer -> Matrix
zeros rows columns channels=1 =
Matrix.Value (Java_Matrix.zeros rows columns channels)
## UNSTABLE
Create a matrix with all elements set to one.
Arguments:
- rows: the number of rows in the resulting matrix.
- columns: the number of columns in the resulting matrix.
- channels: the number of channels in the resulting matrix.
> Example
Create a matrix.
from Standard.Image import Matrix
example_ones = Matrix.zeros rows=2 columns=2 channels=3
ones : Integer -> Integer -> Integer -> Matrix
ones rows columns channels=1 =
Matrix.Value (Java_Matrix.ones rows columns channels)
## UNSTABLE
Create an identity matrix containing ones on a main diagonal.
Arguments:
- rows: the number of rows in the resulting matrix.
- columns: the number of columns in the resulting matrix.
- channels: the number of channels in the resulting matrix.
> Example
Create a matrix.
from Standard.Image import Matrix
example_identity = Matrix.identity rows=2 columns=2 channels=3
identity : Integer -> Integer -> Integer -> Matrix
identity rows columns channels=1 =
Matrix.Value (Java_Matrix.identity rows columns channels)
## PRIVATE
Create a matrix from the provided vector.
Arguments:
- values: the vector of numbers.
- rows: the number of rows in the resulting matrix.
- channels: the number of channels in the resulting matrix.
> Example
Create a matrix.
from Standard.Image import Matrix
example_from_vector = Matrix.from_vector [1, 1, 0, 0] rows=2
from_vector : Vector -> Integer -> Integer -> Matrix
from_vector values rows=1 channels=1 =
Matrix.Value (Java_Matrix.from_vector values.to_array channels rows)
## UNSTABLE
@ -151,10 +149,10 @@ type Matrix
import Standard.Examples
example_get = Examples.matrix.get 0 0
get : Integer -> Integer -> Vector ! Index_Out_Of_Bounds_Error
get : Integer -> Integer -> Vector ! Matrix_Error
get self row column =
if (row < 0) || (row >= self.rows) then Error.throw (Index_Out_Of_Bounds_Error self.rows self.columns row) else
if (column < 0) || (column >= self.columns) then Error.throw (Index_Out_Of_Bounds_Error self.rows self.columns column) else
if (row < 0) || (row >= self.rows) then Error.throw (Matrix_Error.Index_Out_Of_Bounds_Error self.rows self.columns row) else
if (column < 0) || (column >= self.columns) then Error.throw (Matrix_Error.Index_Out_Of_Bounds_Error self.rows self.columns column) else
arr = Java_Matrix.get self.opencv_mat row column
Vector.from_polyglot_array arr
@ -169,14 +167,14 @@ type Matrix
> Example
Reshape the matrix to a new shape of 3 rows and 1 column, with 1 channel.
import Standard.Image.Data.Matrix
from Standard.Image import Matrix
example_rewhsape = Matrix.from_vector [0, 0, 0] . reshape rows=3 channels=1
example_reshape = Matrix.from_vector [0, 0, 0] . reshape rows=3 channels=1
reshape : Integer -> Integer -> Matrix
reshape self rows channels=Nothing =
case channels of
Nothing -> Matrix_Data (self.opencv_mat.reshape self.channels rows)
_ -> Matrix_Data (self.opencv_mat.reshape channels rows)
Nothing -> Matrix.Value (self.opencv_mat.reshape self.channels rows)
_ -> Matrix.Value (self.opencv_mat.reshape channels rows)
## UNSTABLE
@ -213,8 +211,8 @@ type Matrix
import Standard.Examples
example_plus = Examples.matrix + Examples.matrix
+ : (Number | Vector | Matrix) -> Matrix ! Dimensions_Not_Equal
+ self value = Panic.recover Any (Internal.core_op self.opencv_mat value (Java_Matrix.add _ _ _)) . catch Internal.core_op_handler
+ : (Number | Vector | Matrix) -> Matrix ! Matrix_Error
+ self value = Panic.recover Any (core_op self.opencv_mat value (Java_Matrix.add _ _ _)) . catch core_op_handler
## UNSTABLE
@ -252,8 +250,8 @@ type Matrix
import Standard.Examples
example_minus = Examples.matrix - Examples.matrix
- : (Number | Vector | Matrix) -> Matrix ! Dimensions_Not_Equal
- self value = Panic.recover Any (Internal.core_op self.opencv_mat value (Java_Matrix.subtract _ _ _)) . catch Internal.core_op_handler
- : (Number | Vector | Matrix) -> Matrix ! Matrix_Error
- self value = Panic.recover Any (core_op self.opencv_mat value (Java_Matrix.subtract _ _ _)) . catch core_op_handler
## UNSTABLE
@ -296,8 +294,8 @@ type Matrix
> Example
Multiply two matrices.
m * m
* : (Number | Vector | Matrix) -> Matrix ! Dimensions_Not_Equal
* self value = Panic.recover Any (Internal.core_op self.opencv_mat value (Java_Matrix.multiply _ _ _)) . catch Internal.core_op_handler
* : (Number | Vector | Matrix) -> Matrix ! Matrix_Error
* self value = Panic.recover Any (core_op self.opencv_mat value (Java_Matrix.multiply _ _ _)) . catch core_op_handler
## UNSTABLE
@ -334,8 +332,8 @@ type Matrix
import Standard.Examples
example_div = Examples.matrix / Examples.matrix
/ : (Number | Vector | Matrix) -> Matrix ! Dimensions_Not_Equal
/ self value = Panic.recover Any (Internal.core_op self.opencv_mat value (Java_Matrix.divide _ _ _)) . catch Internal.core_op_handler
/ : (Number | Vector | Matrix) -> Matrix ! Matrix_Error
/ self value = Panic.recover Any (core_op self.opencv_mat value (Java_Matrix.divide _ _ _)) . catch core_op_handler
## UNSTABLE
@ -370,26 +368,26 @@ type Matrix
> Example
Normalize a matrix from vector.
import Standard.Image.Data.Matrix
from Standard.Image import Matrix
example_normalize = Matrix.from_vector [0, 1, 2, 3, 4] . normalize
> Example
Normalize a matrix of ones.
import Standard.Image.Data.Matrix
from Standard.Image import Matrix
example_normalize = Matrix.ones 2 3 . normalize
> Example
Normalize an identity matrix.
import Standard.Image.Data.Matrix
from Standard.Image import Matrix
example_normalize = Matrix.identity 3 3 . normalize
normalize : Number -> Number -> Matrix
normalize self min_value=0.0 max_value=1.0 =
Matrix_Data (Java_Matrix.normalize self.opencv_mat min_value max_value)
Matrix.Value (Java_Matrix.normalize self.opencv_mat min_value max_value)
## UNSTABLE
@ -401,12 +399,12 @@ type Matrix
import Standard.Examples
example_to_image = Examples.matrix.to_image
to_image : Image.Image
to_image self = Image.Image (Image.from_vector self.normalize.to_vector self.rows self.channels)
to_image : Image
to_image self = Image (Image.from_vector self.normalize.to_vector self.rows self.channels)
## UNSTABLE
Get the elemets of this matrix as a vector.
Get the elements of this matrix as a vector.
> Example
Convert a matrix to a vector.
@ -432,36 +430,34 @@ type Matrix
to_json : Json
to_json self = Json.String self.opencv_mat.to_text
# TODO Dubious constructor export
from project.Data.Matrix.Matrix_Error import all
from project.Data.Matrix.Matrix_Error export all
## PRIVATE
## UNSTABLE
type Matrix_Error
## UNSTABLE
Indicates that a matrix has been accessed with an illegal index.
Apply a core matrix operation.
Arguments:
- rows: The number of rows in the matrix.
- columns: The number of columns in the matrix.
- index: The requested index in the matrix.
Index_Out_Of_Bounds_Error rows columns index
- mat: The matrix to operate on.
- value: The value to apply to the matrix.
- function: The function with which to apply `value` to `mat`.
core_op : Mat -> Any -> (Mat -> Scalar -> Mat -> Nothing) -> Nothing
core_op mat value function =
result = Mat.new
scalar = case value of
_ : Vector.Vector ->
Scalar.new value.to_array
Matrix.Value m ->
if ((m.rows == mat.rows) && (m.cols == mat.cols) && (m.channels == mat.channels)) then m else Panic.throw Matrix_Error.Dimensions_Not_Equal
_ ->
Scalar.all value
function mat scalar result
Matrix.Value result
## UNSTABLE
## PRIVATE
An error indicating that an operation has failed due to a mismatch of
matrix dimensions.
Dimensions_Not_Equal
## UNSTABLE
Pretty-prints a matrix error to be readable by the users.
to_display_text : Text
to_display_text self = case self of
Index_Out_Of_Bounds_Error rows columns index ->
'For a matrix with dimensions ' + rows.to_text + 'x' + columns.to_text + ', the index ' + index.to_text + ' is out of bounds.'
Dimensions_Not_Equal ->
'Dimensions are not equal.'
Handles errors in `core_op`.
Arguments:
- error: The value to throw as an error.
core_op_handler error =
case error of
Matrix_Error.Dimensions_Not_Equal -> Error.throw error
_ -> Panic.throw error

View File

@ -1,40 +0,0 @@
from Standard.Base import all
import Standard.Image.Data.Matrix
polyglot java import org.enso.image.data.Matrix as Java_Matrix
polyglot java import org.opencv.core.Mat
polyglot java import org.opencv.core.Scalar
## PRIVATE
Apply a core matrix operation.
Arguments:
- mat: The matrix to operate on.
- value: The value to apply to the matrix.
- function: The function with which to apply `value` to `mat`.
core_op : Mat -> Any -> (Mat -> Scalar -> Mat -> Nothing) -> Nothing
core_op mat value function =
result = Mat.new
scalar = case value of
_ : Vector.Vector ->
Scalar.new value.to_array
Matrix.Matrix_Data m ->
if ((m.rows == mat.rows) && (m.cols == mat.cols) && (m.channels == mat.channels)) then m else Panic.throw Matrix.Dimensions_Not_Equal
_ ->
Scalar.all value
function mat scalar result
Matrix.Matrix_Data result
## PRIVATE
Handles errors in `core_op`.
Arguments:
- error: The value to throw as an error.
core_op_handler error =
case error of
Matrix.Dimensions_Not_Equal -> Error.throw error
_ -> Panic.throw error

View File

@ -0,0 +1,30 @@
from Standard.Base import all
## UNSTABLE
type Matrix_Error
## UNSTABLE
Indicates that a matrix has been accessed with an illegal index.
Arguments:
- rows: The number of rows in the matrix.
- columns: The number of columns in the matrix.
- index: The requested index in the matrix.
Index_Out_Of_Bounds_Error rows columns index
## UNSTABLE
An error indicating that an operation has failed due to a mismatch of
matrix dimensions.
Dimensions_Not_Equal
## UNSTABLE
Pretty-prints a matrix error to be readable by the users.
to_display_text : Text
to_display_text self = case self of
Matrix_Error.Index_Out_Of_Bounds_Error rows columns index ->
'For a matrix with dimensions ' + rows.to_text + 'x' + columns.to_text + ', the index ' + index.to_text + ' is out of bounds.'
Matrix_Error.Dimensions_Not_Equal ->
'Dimensions are not equal.'

View File

@ -1,9 +1,11 @@
from Standard.Base import all
import Standard.Image.Codecs
import Standard.Image.Data.Histogram
import Standard.Image.Data.Image
import project.Read_Flag.Read_Flag
import project.Write_Flag.Write_Flag
import project.Data.Image.Image
import project.Data.Matrix.Matrix
from Standard.Image.Codecs export read, write
from Standard.Image.Data.Histogram export all
from Standard.Image.Data.Image export all
export project.Read_Flag.Read_Flag
export project.Write_Flag.Write_Flag
export project.Data.Image.Image
export project.Data.Matrix.Matrix

View File

@ -0,0 +1,28 @@
from Standard.Base import all
polyglot java import org.opencv.imgcodecs.Imgcodecs
## UNSTABLE
type Read_Flag
## UNSTABLE
Read the image with its alpha channel, otherwise the channel gets cropped.
Alpha_Channel
## UNSTABLE
Always convert the image to a single channel grayscale image.
Grayscale
## UNSTABLE
Use Geographic Data Abstraction Library (GDAL) driver to load images in
geospatial raster data formats.
GDAL
## PRIVATE
to_integer self = case self of
Read_Flag.Alpha_Channel -> Imgcodecs.IMREAD_UNCHANGED
Read_Flag.Grayscale -> Imgcodecs.IMREAD_GRAYSCALE
Read_Flag.GDAL -> Imgcodecs.IMREAD_LOAD_GDAL

View File

@ -0,0 +1,73 @@
from Standard.Base import all
polyglot java import org.opencv.imgcodecs.Imgcodecs
## UNSTABLE
type Write_Flag
## UNSTABLE
Sets the quality used when writing a JPEG.
Arguments:
- val: A quality value from 0 to 100 (the higher, the better).
JPEG_Quality val:Integer=95
## UNSTABLE
Enable progressive JPEG compression format. Disabled by default.
JPEG_Progressive
## UNSTABLE
Enable optimized JPEG encoding algorithms. Disabled by default.
JPEG_Optimize
## UNSTABLE
Sets the luma quality level used when writing a JPEG.
Arguments:
- val: A quality value from 0 to 100 (the higher, the better).
JPEG_Luma_Quality val:Integer=0
## UNSTABLE
Sets the chroma quality level used when writing a JPEG.
Arguments:
- val: A quality value from 0 to 100 (the higher, the better).
JPEG_Chroma_Quality val=0
## UNSTABLE
Sets the compression level used when writing a PNG.
Arguments:
- val: A compression level from 0 to 9. A higher value means a smaller
size but a longer compression time.
PNG_Compression val:Integer=3
## UNSTABLE
Sets the quality used when writing a WEBP image.
Arguments:
- val: A quality from 0 to 100 (the higher, the better). A quality
above 100 indicates that the encoder should use lossless compression.
WEBP_Quality val=101
## PRIVATE
value self = case self of
Write_Flag.JPEG_Progressive -> 1
Write_Flag.JPEG_Optimize -> 1
_ -> self.val
## PRIVATE
to_integer self = case self of
Write_Flag.JPEG_Quality _ -> Imgcodecs.IMWRITE_JPEG_QUALITY
Write_Flag.JPEG_Progressive -> Imgcodecs.IMWRITE_JPEG_PROGRESSIVE
Write_Flag.JPEG_Optimize -> Imgcodecs.IMWRITE_JPEG_OPTIMIZE
Write_Flag.JPEG_Luma_Quality _ -> Imgcodecs.IMWRITE_JPEG_LUMA_QUALITY
Write_Flag.JPEG_Chroma_Quality _ -> Imgcodecs.IMWRITE_JPEG_CHROMA_QUALITY
Write_Flag.PNG_Compression _ -> Imgcodecs.IMWRITE_PNG_COMPRESSION
Write_Flag.WEBP_Quality _ -> Imgcodecs.IMWRITE_WEBP_QUALITY

View File

@ -47,7 +47,7 @@ export project.Excel.Excel_Range.Excel_Range
export project.Data.Data_Formatter.Data_Formatter
import Standard.Geo.Geo_Json
from Standard.Geo.Geo_Json import Object_Type
## ALIAS To Table
@ -87,14 +87,14 @@ Json.Json.to_table self fields=Nothing = case self of
Json.Array items ->
rows = items.map item-> case item of
Json.Object fs ->
row = if item.get_type == Geo_Json.Feature.to_text then item.get_feature_row else fs
row = if item.get_type == Object_Type.Feature.to_text then item.get_feature_row else fs
fields.map n-> row.get n . unwrap . catch Any (_ -> Nothing)
_ -> Vector.fill fields.length Nothing
cols = fields.map_with_index i-> n->
[n, rows.map (_.at i)]
Table.new cols
Json.Object _ ->
if self.get_type != Geo_Json.Feature_Collection.to_text then Error.throw (Invalid_Format_Error.Invalid_Format_Error_Data self "not being a feature collection") else
if self.get_type != Object_Type.Feature_Collection.to_text then Error.throw (Invalid_Format_Error.Invalid_Format_Error_Data self "not being a feature collection") else
case self.get "features" of
Json.Array items ->
feature_rows = items.map .get_feature_row

View File

@ -2,6 +2,7 @@ from Standard.Base import all
import Standard.Base.System
import Standard.Base.Runtime.Ref
type Bench
## Measure the amount of time it takes to execute a given computation.
Arguments:
@ -15,7 +16,7 @@ import Standard.Base.Runtime.Ref
of iterations of 1.
import Standard.Examples
import Standard.Test.Bench
from Standard.Test import Bench
example_measure =
Bench.measure Examples.get_boolean "foo" iter_size=2 num_iters=1
@ -29,16 +30,15 @@ measure = ~act -> label -> iter_size -> num_iters ->
x2 - x1
iteration = it_num ->
act_it_num = num_iters - it_num
res = iter_size.times single_call
res = times iter_size single_call
avg = avg_list res
fmt = (avg / 1000000).format "%.2f"
result.put (result.get + avg)
IO.println (label + "/iteration:" + act_it_num.to_text + ": " + fmt + "ms")
num_iters.times iteration
times num_iters iteration
fmt_avg = (result.get / (1000000*num_iters)).format "%.2f"
IO.println (label + " average: " + fmt_avg + "ms")
## PRIVATE
Reverses the provided list.
@ -96,11 +96,10 @@ len_list list =
Perform an action a number of times.
Arguments:
- act: The action to perform `self` number of times.
Number.times : List Any
Number.times self act =
- act: The action to perform `count` number of times.
times : Integer-> List Any
times count act =
go = results -> number -> if number == 0 then results else
@Tail_Call go (Cons (act number) results) number-1
res = reverse_list (go Nil self)
res = reverse_list (go Nil count)
res

View File

@ -0,0 +1,410 @@
from Standard.Base import all
import project.Test_Result.Test_Result
from project.Test import Test
## Expect a function to fail with the provided dataflow error.
Arguments:
- matcher: The expected type of dataflow error contained in `self`.
- frames_to_skip (optional, advanced): used to alter the location which is
displayed as the source of this error.
> Example
Assert that a computation should return an error of a given type.
import Standard.Examples
from Standard.Test import Test
example_should_fail_with =
Examples.throw_error . should_fail_with Examples.My_Error
Any.should_fail_with : Any -> Integer -> Test_Result
Any.should_fail_with self matcher frames_to_skip=0 =
loc = Meta.get_source_location 1+frames_to_skip
Test.fail ("Expected an error " + matcher.to_text + " but no error occurred, instead got: " + self.to_text + " (at " + loc + ").")
## Expect a function to fail with the provided dataflow error.
Arguments:
- matcher: The expected type of dataflow error contained in `self`.
- frames_to_skip (optional, advanced): used to alter the location which is
displayed as the source of this error.
> Example
Assert that a computation should return an error of a given type.
import Standard.Examples
from Standard.Test import Test
example_should_fail_with =
Examples.throw_error . should_fail_with Examples.My_Error
Error.should_fail_with : Any -> Integer -> Test_Result
Error.should_fail_with self matcher frames_to_skip=0 =
caught = self.catch
if caught.is_a matcher then Nothing else
loc = Meta.get_source_location 2+frames_to_skip
Test.fail ("Expected error "+matcher.to_text+", but error " + caught.to_text + " has been returned (at " + loc + ").")
## Asserts that `self` value is equal to the expected value.
Arguments:
- that: The value to check `self` for equality with.
- frames_to_skip (optional, advanced): used to alter the location which is
displayed as the source of this error.
> Example
Assert that one value should equal another,
import Standard.Examples
from Standard.Test import Test
example_should_equal = Examples.add_1_to 1 . should_equal 2
Any.should_equal : Any -> Integer -> Test_Result
Any.should_equal self that frames_to_skip=0 = case self == that of
True -> Test_Result.Success
False ->
loc = Meta.get_source_location 2+frames_to_skip
msg = self.to_text + " did not equal " + that.to_text + " (at " + loc + ")."
Test.fail msg
## Asserts that `self` value is equal to the expected type value.
Arguments:
- that: The type to check `self` for equality with.
- frames_to_skip (optional, advanced): used to alter the location which is
displayed as the source of this error.
> Example
Assert that some type is equal to another.,
import Standard.Examples
from Standard.Test import Test
example_should_equal = Examples.some_tpe . should_equal_tpe Vector.Vector
Any.should_equal_type : Any -> Integer -> Test_Result
Any.should_equal_type self that frames_to_skip=0 = case (self.is_same_object_as that) of
True -> Test_Result.Success
False ->
loc = Meta.get_source_location 2+frames_to_skip
msg = self.to_text + " did not equal type " + that.to_text + " (at " + loc + ")."
Test.fail msg
## Asserts that `self` value is not equal to the expected value.
Arguments:
- that: The value to check `self` for equality with.
- frames_to_skip (optional, advanced): used to alter the location which is
displayed as the source of this error.
> Example
Assert that one value should equal another,
import Standard.Examples
from Standard.Test import Test
example_should_not_equal = Examples.add_1_to 1 . should_not_equal 2
Any.should_not_equal : Any -> Integer -> Test_Result
Any.should_not_equal self that frames_to_skip=0 = case self != that of
True -> Test_Result.Success
False ->
loc = Meta.get_source_location 2+frames_to_skip
msg = self.to_text + " did equal " + that.to_text + " (at " + loc + ")."
Test.fail msg
## Asserts that `self` value is not equal to the expected type value.
Arguments:
- that: The type to check `self` for equality with.
- frames_to_skip (optional, advanced): used to alter the location which is
displayed as the source of this error.
> Example
Assert that some type is equal to another.,
import Standard.Examples
from Standard.Test import Test
example_should_not_equal = Examples.some_tpe . should_not_equal_tpe Vector.Vector
Any.should_not_equal_type : Any -> Integer -> Test_Result
Any.should_not_equal_type self that frames_to_skip=0 = case (self.is_same_object_as that . not) of
True -> Test_Result.Success
False ->
loc = Meta.get_source_location 2+frames_to_skip
msg = self.to_text + " did equal type " + that.to_text + " (at " + loc + ")."
Test.fail msg
## Asserts that `self` value is a Text value and starts with `that`.
Arguments:
- that: The value to check `self` starts with.
- frames_to_skip (optional, advanced): used to alter the location which is
displayed as the source of this error.
> Example
Assert that one value should start with another.
from Standard.Test import Test
example_should_start_with = "Hello World!" . should_start_with "Hello"
Any.should_start_with : Text -> Integer -> Test_Result
Any.should_start_with self that frames_to_skip=0 = case self of
_ : Text -> if self.starts_with that then Test_Result.Success else
loc = Meta.get_source_location 3+frames_to_skip
msg = self.to_text + " does not start with " + that.to_text + " (at " + loc + ")."
Test.fail msg
_ ->
loc = Meta.get_source_location 2+frames_to_skip
msg = self.to_text + " is not a `Text` value (at " + loc + ")."
Test.fail msg
## Asserts that `self` value is a Text value and contains `that`.
Arguments:
- that: The value to check `self` contains.
- frames_to_skip (optional, advanced): used to alter the location which is
displayed as the source of this error.
> Example
Assert that one value should contain another.
from Standard.Test import Test
example_should_start_with = "Hello World!" . should_contain "World"
Any.should_contain : Text -> Integer -> Test_Result
Any.should_contain self that frames_to_skip=0 = case self of
_ : Text -> if self.contains that then Test_Result.Success else
loc = Meta.get_source_location 3+frames_to_skip
msg = self.to_text + " does not contain " + that.to_text + " (at " + loc + ")."
Test.fail msg
_ ->
loc = Meta.get_source_location 2+frames_to_skip
msg = self.to_text + " is not a `Text` value (at " + loc + ")."
Test.fail msg
## Asserts that `self` value is equal to the expected value.
Arguments:
- _: The value to check `self` for equality with.
> Example
Assert that one value should equal another,
import Standard.Examples
from Standard.Test import Test
example_should_equal = Examples.add_1_to 1 . should_equal 2
Error.should_equal : Any -> Test_Result
Error.should_equal self _ frames_to_skip=0 = Test.fail_match_on_unexpected_error self 1+frames_to_skip
## Asserts that `self` is within `epsilon` from `that`.
Arguments:
- that: The value to compare `self` for equality with.
- epsilon: The epislon for comparing two decimal numbers.
- frames_to_skip (optional, advanced): used to alter the location which is
displayed as the source of this error.
> Example
Compare two decimal values.
from Standard.Test import Test
example_should_equal = 1.1 . should_equal 1.1
> Example
Compare two decimal values with an epsilon (tolerance).
from Standard.Test import Test
example_should_equal =
1.00000001 . should_equal 1.00000002 epsilon=0.0001
Number.should_equal : Decimal -> Decimal -> Integer -> Test_Result
Number.should_equal self that epsilon=0 frames_to_skip=0 =
matches = case that of
_ : Number -> self.equals that epsilon
_ -> False
case matches of
True -> Test_Result.Success
False ->
loc = Meta.get_source_location 2+frames_to_skip
msg = self.to_text + " did not equal " + that.to_text + " (at " + loc + ")."
Test.fail msg
## Asserts that `self` value is not an error.
It returns the original value, so that it can be inspected further.
Arguments:
- frames_to_skip (optional, advanced): used to alter the location which is
displayed as the source of this error.
> Example
Assert that a given action did not result in errors or warnings.
"foobar".write (enso_project.data / "f.txt") . should_succeed
Any.should_succeed : Boolean -> Integer -> Any
Any.should_succeed self frames_to_skip=0 =
_ = frames_to_skip
self
## Asserts that `self` value is not an error.
It returns the original value, so that it can be inspected further.
Arguments:
- frames_to_skip (optional, advanced): used to alter the location which is
displayed as the source of this error.
> Example
Assert that a given action did not result in errors or warnings.
"foobar".write (enso_project.data / "f.txt") . should_succeed
Error.should_succeed : Boolean -> Integer -> Any
Error.should_succeed self frames_to_skip=0 =
Test.fail_match_on_unexpected_error self 1+frames_to_skip
## Asserts that the given `Boolean` is `True`
> Example
Assert that a boolean value is true.
import Standard.Examples
from Standard.Test import Test
example_should_be_true = Examples.get_boolean . should_be_true
Boolean.should_be_true : Test_Result
Boolean.should_be_true self = case self of
True -> Test_Result.Success
False ->
loc = Meta.get_source_location 2
Panic.throw (Test_Result.Failure "Expected False to be True (at "+loc+").")
## Asserts that the given `Boolean` is `True`.
> Example
Assert that a boolean value is true.
import Standard.Examples
from Standard.Test import Test
example_should_be_true = Examples.get_boolean . should_be_true
Error.should_be_true : Test_Result
Error.should_be_true self = Test.fail_match_on_unexpected_error self 1
## Asserts that the given `Boolean` is `False`
> Example
Assert that a boolean value is false.
import Standard.Examples
from Standard.Test import Test
example_should_be_false = Examples.get_boolean . should_be_false
Boolean.should_be_false : Test_Result
Boolean.should_be_false self = case self of
True ->
loc = Meta.get_source_location 2
Panic.throw (Test_Result.Failure "Expected True to be False (at "+loc+").")
False -> Test_Result.Success
## Asserts that the given `Boolean` is `False`
> Example
Assert that a boolean value is false.
import Standard.Examples
from Standard.Test import Test
example_should_be_false = Examples.get_boolean . should_be_false
Error.should_be_false : Test_Result
Error.should_be_false self = Test.fail_match_on_unexpected_error self 1
## Asserts that a value is of a given type.
Arguments:
- typ: The type to assert that `self` is a value of.
> Examples
Assert that 1 is of type Boolean.
from Standard.Test import Test
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 + ")."
Panic.throw <| Test_Result.Failure message
## Asserts that a value is of a given type.
Arguments:
- typ: The type to assert that `self` is a value of.
> Examples
Assert that 1 is of type Integer.
from Standard.Test import Test
example_should_be_an = 1.should_be_an Integer
Any.should_be_an : Any -> Test_Result
Any.should_be_an self typ = self.should_be_a typ
## Asserts that `self` value contains the same elements as `that`.
It only checks that all elements from one collection are also present in the
other one. Arities of elements are not checked, so the collections can still
differ in length by containing duplicate elements.
It will work on any collection which supports the methods
`each : (Any -> Nothing) -> Any` and `contains : Any -> Boolean`.
Arguments:
- that: The collection to compare.
- frames_to_skip (optional, advanced): used to alter the location which is
displayed as the source of this error.
> Example
Assert that one vector should contain the same elements as another.
import Standard.Examples
from Standard.Test import Test
example_should_equal = [1, 2] . should_contain_the_same_elements_as [2, 1]
Any.should_contain_the_same_elements_as : Any -> Integer -> Test_Result
Any.should_contain_the_same_elements_as self that frames_to_skip=0 =
loc = Meta.get_source_location 1+frames_to_skip
that.each element->
if self.contains element . not then
msg = "The collection (" + self.to_text + ") did not contain "+element.to_text+" (at " + loc + ")."
Test.fail msg
self.each element->
if that.contains element . not then
msg = "The collection contained an element ("+element.to_text+") which was not expected (at " + loc + ")."
Test.fail msg
## Asserts that `self` value contains the same elements as `that`.
It only checks that all elements from one collection are also present in the
other one. Arities of elements are not checked, so the collections can still
differ in length by containing duplicate elements.
It will work on any collection which supports the methods
`each : (Any -> Nothing) -> Any` and `contains : Any -> Boolean`.
Arguments:
- _: The collection to compare.
- frames_to_skip (optional, advanced): used to alter the location which is
displayed as the source of this error.
> Example
Assert that one vector should contain the same elements as another.
import Standard.Examples
from Standard.Test import Test
example_should_equal = [1, 2] . should_contain_the_same_elements_as [2, 1]
Error.should_contain_the_same_elements_as : Any -> Test_Result
Error.should_contain_the_same_elements_as self _ frames_to_skip=0 = Test.fail_match_on_unexpected_error self 1+frames_to_skip

View File

@ -3,8 +3,12 @@ from Standard.Base import all
polyglot java import java.util.Random
polyglot java import org.enso.base.Text_Utils
## Object to generate (deterministic) random value for testing
type Faker
upper_case_letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".char_vector
lower_case_letters = "abcdefghijklmnopqrstuvwxyz".char_vector
numbers = "0123456789".char_vector
## Creates a new Faker which can be used for creating test values.
@ -14,11 +18,9 @@ numbers = "0123456789".char_vector
new : Integer -> Faker
new (seed = 0) =
generator = if seed == 0 then Random.new else Random.new seed
Faker generator
Faker.Value generator
## Object to generate (deterministic) random value for testing
type Faker
type Faker generator
Value generator
## Creates a random Text based on a template of character sets.
@ -48,7 +50,7 @@ type Faker
- upper_case: use upper_case letters
alpha : Integer -> Boolean -> Text
alpha self length=1 upper_case=False =
alphabet = if upper_case then upper_case_letters else lower_case_letters
alphabet = if upper_case then Faker.upper_case_letters else Faker.lower_case_letters
self.string_value <| 0.up_to length . map _->alphabet
## Generates a Text consisting of lower/upper case characters and digits.
@ -58,7 +60,7 @@ type Faker
- upper_case: use upper_case letters
alpha_numeric : Integer -> Boolean -> Text
alpha_numeric self length=1 upper_case=False =
alphabet = (if upper_case then upper_case_letters else lower_case_letters) + numbers
alphabet = (if upper_case then Faker.upper_case_letters else Faker.lower_case_letters) + Faker.numbers
self.string_value <| 0.up_to length . map _->alphabet
## Generates a Text for a hexadecimal number

View File

@ -1,892 +1,15 @@
from Standard.Base import all
import Standard.Base.Data.Time.Duration
import Standard.Base.Runtime.State
import Standard.Base.System
polyglot java import java.lang.NullPointerException
polyglot java import java.lang.StringBuilder
## Creates a new test group, describing properties of the object
described by `self`.
Arguments:
- specs: An action encapsulating a number of test specs or groups.
> Example
Building a basic test suite.
import Standard.Test
example_run_main = Test.Suite.run_main <|
Test.group "Number" <|
Test.specify "should define addition" <|
2+3 . should_equal 5
Test.specify "should define multiplication" <|
2*3 . should_equal 6
Suite.run_main : Any -> Nothing
Suite.run_main ~specs =
config = config_from_env
r = Suite.run specs config
code = if r.is_fail then 1 else 0
System.exit code
## PRIVATE
find_project_root : File -> File
find_project_root path =
if path.is_nothing then Nothing else
handler _ = Nothing
Panic.catch NullPointerException handler=handler <|
if path.name == "src" then path.parent else
@Tail_Call find_project_root path.parent
## PRIVATE
find_caller_script : [Stack_Trace_Element] -> File
find_caller_script stack =
find_main idx =
if stack.at idx . name == "Suite.type.run_main" then idx else
@Tail_Call find_main (idx + 1)
main_index = find_main 0
find_caller idx =
source = stack.at idx . source_location
if source.is_a Source_Location_Data then stack.at idx . source_location . file else
if (idx + 1 == stack.length) then Nothing else
@Tail_Call find_caller (idx + 1)
find_caller (main_index + 1)
## PRIVATE
Creates an Suite_Config based off environment and caller location
config_from_env : Suite_Config
config_from_env =
only_group_regexp = Environment.get "TEST_ONLY_GROUP"
print_only_failures = Environment.get "REPORT_ONLY_FAILED" != Nothing
junit_folder = Environment.get "ENSO_TEST_JUNIT_DIR"
results_path = if junit_folder.is_nothing then Nothing else
caller_script = find_caller_script Runtime.get_stack_trace
project_root = find_project_root caller_script
case project_root.is_nothing of
True ->
IO.println "Unable to determine root project path. JUnit output disabled."
Nothing
False ->
(File.new junit_folder) / project_root.name / "JUnit.xml"
Suite_Config_Data only_group_regexp print_only_failures results_path
## Creates a new test group, describing properties of the object
described by `self`.
Arguments:
- specs: An action encapsulating a number of test specs or groups.
> Example
Building a basic test suite.
import Standard.Test
example_run = Test.Suite.run <|
Test.group "Number" <|
Test.specify "should define addition" <|
2+3 . should_equal 5
Test.specify "should define multiplication" <|
2*3 . should_equal 6
Suite.run : Any -> Suite_Config -> Any
Suite.run ~specs config =
builder = if config.should_output_junit then StringBuilder.new else Nothing
wrap_junit_testsuites config builder <|
State.run Suite (Suite_Data config Nil builder) <|
specs
State.get Suite
## Creates a new test group, describing properties of the object
described by `self`.
Arguments:
- name: The name of the test group.
- behaviors: An action containing a set of specs for the group.
- pending: A reason for why the test is pending, or `Nothing` when it is not
pending.
> Example
Adding a test group.
import Standard.Test
example_group = Test.Suite.run <|
Test.group "Number" <| Nothing
group : Text -> Any -> (Text | Nothing) -> Nothing
group name ~behaviors pending=Nothing =
suite = State.get Suite
config = suite.config
if config.should_run_group name then
case pending of
Nothing ->
r = State.run Spec (Spec_Data name Nil) <|
behaviors
State.get Spec
r.print_report config suite.builder
new_suite = Suite_Data suite.config (Cons r suite.specs) suite.builder
State.put Suite new_suite
reason ->
report_pending_group name reason config suite.builder
## Specifies a single behavior, described by `self`.
Arguments:
- label: A description of the behavior being tested.
- behavior: An action that executes tests.
- pending: A reason for why the test is pending, or `Nothing` when it is not
pending.
> Example
Adding a specification to the test group.
import Standard.Test
example_group = Test.Suite.run <|
Test.group "Number" <|
Test.specify "should define addition" <|
2+3 . should_equal 5
> Example
Adding a pending specification to the test group.
import Standard.Test
example_group = Test.Suite.run <|
Test.group "Number" <|
Test.specify "should define addition" pending="Reason" <|
2+3 . should_equal 5
specify : Text -> Any -> (Text | Nothing) -> Nothing
specify label ~behavior pending=Nothing =
pair = case pending of
Nothing -> Duration.time_execution (run_spec behavior)
reason -> Pair_Data Duration.zero (Pending reason)
result = pair.second
time_taken = pair.first
spec = State.get Spec
new_spec = Spec_Data spec.name (Cons (Behavior_Data label result time_taken) spec.behaviors)
State.put Spec new_spec
## PRIVATE
Asserts a property about the receiver.
Arguments:
- verb: The property (see `Verbs`) being asserted
- argument: The argument to the verb.
Any.should : (Verbs -> Any -> Any) -> Any -> Assertion
Any.should self verb argument = verb Verbs self argument
## Fail a test with the given message.
Arguments:
- message: The message printed when failing the test.
> Example
Failing a test manually.
import Standard.Test
example_fail = Test.fail "Something went wrong."
fail : Text -> Assertion
fail message details=Nothing =
failure = Failure message details
Panic.throw failure
## Expect a function to fail with the provided dataflow error.
Arguments:
- matcher: The expected type of dataflow error contained in `self`.
- frames_to_skip (optional, advanced): used to alter the location which is
displayed as the source of this error.
> Example
Assert that a computation should return an error of a given type.
import Standard.Examples
import Standard.Test
example_should_fail_with =
Examples.throw_error . should_fail_with Examples.My_Error
Any.should_fail_with : Any -> Integer -> Assertion
Any.should_fail_with self matcher frames_to_skip=0 =
loc = Meta.get_source_location 1+frames_to_skip
fail ("Expected an error " + matcher.to_text + " but no error occurred, instead got: " + self.to_text + " (at " + loc + ").")
## Expect a function to fail with the provided dataflow error.
Arguments:
- matcher: The expected type of dataflow error contained in `self`.
- frames_to_skip (optional, advanced): used to alter the location which is
displayed as the source of this error.
> Example
Assert that a computation should return an error of a given type.
import Standard.Examples
import Standard.Test
example_should_fail_with =
Examples.throw_error . should_fail_with Examples.My_Error
Error.should_fail_with : Any -> Integer -> Assertion
Error.should_fail_with self matcher frames_to_skip=0 =
caught = self.catch
if caught.is_a matcher then Nothing else
loc = Meta.get_source_location 2+frames_to_skip
fail ("Expected error "+matcher.to_text+", but error " + caught.to_text + " has been returned (at " + loc + ").")
## Expect a function to fail with the provided panic.
Arguments:
- action: The action to evaluate that is expected to fail with a panic.
- matcher: The expected type of the panic thrown by `action`.
> Example
Expect that a computation should panic as part of a test.
import Standard.Examples
import Standard.Test
example_expect_panic_with =
Test.expect_panic_with Examples.throw_panic Examples.My_Error
expect_panic_with : Any -> Any -> Assertion
expect_panic_with ~action matcher =
res = Panic.recover Any action
case res of
_ ->
loc = Meta.get_source_location 2
return_suffix = if res.is_nothing then "" else "and returned ["+res.to_text+"]"
fail ("Expected a " + matcher.to_text + " to be thrown, but the action succeeded " + return_suffix + " (at "+loc+").")
err = res.catch
if err.is_a matcher then Nothing else
fail ("Expected a " + matcher.to_text + ", but " + err.to_text + " was thrown instead.")
## Asserts that `self` value is equal to the expected value.
Arguments:
- that: The value to check `self` for equality with.
- frames_to_skip (optional, advanced): used to alter the location which is
displayed as the source of this error.
> Example
Assert that one value should equal another,
import Standard.Examples
import Standard.Test
example_should_equal = Examples.add_1_to 1 . should_equal 2
Any.should_equal : Any -> Integer -> Assertion
Any.should_equal self that frames_to_skip=0 = case self == that of
True -> Success
False ->
loc = Meta.get_source_location 2+frames_to_skip
msg = self.to_text + " did not equal " + that.to_text + " (at " + loc + ")."
fail msg
## Asserts that `self` value is equal to the expected type value.
Arguments:
- that: The type to check `self` for equality with.
- frames_to_skip (optional, advanced): used to alter the location which is
displayed as the source of this error.
> Example
Assert that some type is equal to another.,
import Standard.Examples
import Standard.Test
example_should_equal = Examples.some_tpe . should_equal_tpe Vector.Vector
Any.should_equal_type : Any -> Integer -> Assertion
Any.should_equal_type self that frames_to_skip=0 = case (self.is_same_object_as that) of
True -> Success
False ->
loc = Meta.get_source_location 2+frames_to_skip
msg = self.to_text + " did not equal type " + that.to_text + " (at " + loc + ")."
fail msg
## Asserts that `self` value is not equal to the expected value.
Arguments:
- that: The value to check `self` for equality with.
- frames_to_skip (optional, advanced): used to alter the location which is
displayed as the source of this error.
> Example
Assert that one value should equal another,
import Standard.Examples
import Standard.Test
example_should_not_equal = Examples.add_1_to 1 . should_not_equal 2
Any.should_not_equal : Any -> Integer -> Assertion
Any.should_not_equal self that frames_to_skip=0 = case self != that of
True -> Success
False ->
loc = Meta.get_source_location 2+frames_to_skip
msg = self.to_text + " did equal " + that.to_text + " (at " + loc + ")."
fail msg
## Asserts that `self` value is not equal to the expected type value.
Arguments:
- that: The type to check `self` for equality with.
- frames_to_skip (optional, advanced): used to alter the location which is
displayed as the source of this error.
> Example
Assert that some type is equal to another.,
import Standard.Examples
import Standard.Test
example_should_not_equal = Examples.some_tpe . should_not_equal_tpe Vector.Vector
Any.should_not_equal_type : Any -> Integer -> Assertion
Any.should_not_equal_type self that frames_to_skip=0 = case (self.is_same_object_as that . not) of
True -> Success
False ->
loc = Meta.get_source_location 2+frames_to_skip
msg = self.to_text + " did equal type " + that.to_text + " (at " + loc + ")."
fail msg
## Asserts that `self` value is equal to the expected value.
Arguments:
- _: The value to check `self` for equality with.
> Example
Assert that one value should equal another,
import Standard.Examples
import Standard.Test
example_should_equal = Examples.add_1_to 1 . should_equal 2
Error.should_equal : Any -> Assertion
Error.should_equal self _ frames_to_skip=0 = fail_match_on_unexpected_error self 1+frames_to_skip
## Asserts that `self` is within `epsilon` from `that`.
Arguments:
- that: The value to compare `self` for equality with.
- epsilon: The epislon for comparing two decimal numbers.
- frames_to_skip (optional, advanced): used to alter the location which is
displayed as the source of this error.
> Example
Compare two decimal values.
import Standard.Test
example_should_equal = 1.1 . should_equal 1.1
> Example
Compare two decimal values with an epsilon (tolerance).
import Standard.Test
example_should_equal =
1.00000001 . should_equal 1.00000002 epsilon=0.0001
Number.should_equal : Decimal -> Decimal -> Integer -> Assertion
Number.should_equal self that epsilon=0 frames_to_skip=0 =
matches = case that of
_ : Number -> self.equals that epsilon
_ -> False
case matches of
True -> Success
False ->
loc = Meta.get_source_location 2+frames_to_skip
msg = self.to_text + " did not equal " + that.to_text + " (at " + loc + ")."
fail msg
## Asserts that `self` value is not an error.
It returns the original value, so that it can be inspected further.
Arguments:
- frames_to_skip (optional, advanced): used to alter the location which is
displayed as the source of this error.
> Example
Assert that a given action did not result in errors or warnings.
"foobar".write (enso_project.data / "f.txt") . should_succeed
Any.should_succeed : Boolean -> Integer -> Any
Any.should_succeed self frames_to_skip=0 =
_ = frames_to_skip
self
## Asserts that `self` value is not an error.
It returns the original value, so that it can be inspected further.
Arguments:
- frames_to_skip (optional, advanced): used to alter the location which is
displayed as the source of this error.
> Example
Assert that a given action did not result in errors or warnings.
"foobar".write (enso_project.data / "f.txt") . should_succeed
Error.should_succeed : Boolean -> Integer -> Any
Error.should_succeed self frames_to_skip=0 =
fail_match_on_unexpected_error self 1+frames_to_skip
## Checks that the provided action returns without any errors or warnings.
If you just want to check for errors, usage of the `.should_succeed`
extension function is preferred.
assert_no_problems value frames_to_skip=0 =
value.catch Any _->
fail_match_on_unexpected_error value 2+frames_to_skip
warnings = Warning.get_all value . map .value
if warnings.not_empty then
loc = Meta.get_source_location 2+frames_to_skip
msg = "The action returned unexpected warnings: " + warnings.to_text + " (at " + loc + ")."
fail msg
## Asserts that the given `Boolean` is `True`
> Example
Assert that a boolean value is true.
import Standard.Examples
import Standard.Test
example_should_be_true = Examples.get_boolean . should_be_true
Boolean.should_be_true : Assertion
Boolean.should_be_true self = case self of
True -> Success
False ->
loc = Meta.get_source_location 2
Panic.throw (Failure "Expected False to be True (at "+loc+").")
## Asserts that the given `Boolean` is `True`.
> Example
Assert that a boolean value is true.
import Standard.Examples
import Standard.Test
example_should_be_true = Examples.get_boolean . should_be_true
Error.should_be_true : Assertion
Error.should_be_true self = fail_match_on_unexpected_error self 1
## Asserts that the given `Boolean` is `False`
> Example
Assert that a boolean value is false.
import Standard.Examples
import Standard.Test
example_should_be_false = Examples.get_boolean . should_be_false
Boolean.should_be_false : Assertion
Boolean.should_be_false self = case self of
True ->
loc = Meta.get_source_location 2
Panic.throw (Failure "Expected True to be False (at "+loc+").")
False -> Success
## Asserts that the given `Boolean` is `False`
> Example
Assert that a boolean value is false.
import Standard.Examples
import Standard.Test
example_should_be_false = Examples.get_boolean . should_be_false
Error.should_be_false : Assertion
Error.should_be_false self = fail_match_on_unexpected_error self 1
## Asserts that a value is of a given type.
Arguments:
- typ: The type to assert that `self` is a value of.
> Examples
Assert that 1 is of type Boolean.
import Standard.Test
example_should_be_a = 1.should_be_a Boolean
Any.should_be_a : Any -> Assertion
Any.should_be_a self typ = if self.is_a typ || self==typ then 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 + ")."
Panic.throw <| Failure message
## Asserts that a value is of a given type.
Arguments:
- typ: The type to assert that `self` is a value of.
> Examples
Assert that 1 is of type Integer.
import Standard.Test
example_should_be_an = 1.should_be_an Integer
Any.should_be_an : Any -> Assertion
Any.should_be_an self typ = self.should_be_a typ
## Asserts that `self` value contains the same elements as `that`.
It only checks that all elements from one collection are also present in the
other one. Arities of elements are not checked, so the collections can still
differ in length by containing duplicate elements.
It will work on any collection which supports the methods
`each : (Any -> Nothing) -> Any` and `contains : Any -> Boolean`.
Arguments:
- that: The collection to compare.
- frames_to_skip (optional, advanced): used to alter the location which is
displayed as the source of this error.
> Example
Assert that one vector should contain the same elements as another.
import Standard.Examples
import Standard.Test
example_should_equal = [1, 2] . should_contain_the_same_elements_as [2, 1]
Any.should_contain_the_same_elements_as : Any -> Integer -> Assertion
Any.should_contain_the_same_elements_as self that frames_to_skip=0 =
loc = Meta.get_source_location 1+frames_to_skip
that.each element->
if self.contains element . not then
msg = "The collection (" + self.to_text + ") did not contain "+element.to_text+" (at " + loc + ")."
fail msg
self.each element->
if that.contains element . not then
msg = "The collection contained an element ("+element.to_text+") which was not expected (at " + loc + ")."
fail msg
## Asserts that `self` value contains the same elements as `that`.
It only checks that all elements from one collection are also present in the
other one. Arities of elements are not checked, so the collections can still
differ in length by containing duplicate elements.
It will work on any collection which supports the methods
`each : (Any -> Nothing) -> Any` and `contains : Any -> Boolean`.
Arguments:
- _: The collection to compare.
- frames_to_skip (optional, advanced): used to alter the location which is
displayed as the source of this error.
> Example
Assert that one vector should contain the same elements as another.
import Standard.Examples
import Standard.Test
example_should_equal = [1, 2] . should_contain_the_same_elements_as [2, 1]
Error.should_contain_the_same_elements_as : Any -> Assertion
Error.should_contain_the_same_elements_as self _ frames_to_skip=0 = fail_match_on_unexpected_error self 1+frames_to_skip
type Verbs
## PRIVATE
Checks if the `subject` starts with `argument`.
Arguments:
- subject: The value to check. It must have a `.starts_with` method.
- argument: The expected prefix.
start_with : Text -> Text -> Assertion
start_with self subject argument =
if subject.starts_with argument then Success else
fail (subject.to_text + " did not start with " + argument.to_text)
## PRIVATE
Checks if the `subject` is equal to the `argument`.
Arguments:
- subject: The value to check for equality against the provided value.
- argument: The provided value to check the `subject` for equality
against.
equal : Any -> Any -> Assertion
equal self subject argument =
if subject == argument then Success else
msg = subject.to_text + " did not equal " + argument.to_text + "."
fail msg
## PRIVATE
Checks if `subject` is `argument`.
Arguments:
- subject: The value to check for equality against the provided value.
- argument: The provided value to check the `subject` for equality
against.
be : Any -> Any -> Assertion
be self subject argument = self.equal subject argument
## PRIVATE
Checks if `subject` contains `argument`.
Arguments:
- subject: The collection type to check if `argument` is contained in it.
This type must have a `.contains` method.
- argument: The value to see if it is contained in `subject`.
contain : Any -> Any -> Assertion
contain self subject argument =
if subject.contains argument then Success else
msg = subject.to_text + " did not contain " + argument.to_text + "."
fail msg
from project.Main.Suite_Config import all
## PRVATE
type Suite_Config
Suite_Config_Data only_group_regexp print_only_failures output_path
should_run_group self name =
regexp = self.only_group_regexp
case regexp of
_ : Text -> name.matches regexp . catch Any (_->True)
_ -> True
should_output_junit self =
self.output_path.is_nothing.not
from project.Main.Suite import all
## PRIVATE
The top-level entry point for a test suite.
Arguments:
- config: Suite_Config controlloing the test run.
- specs: The specs contained within the test suite.
- builder: StringBuilder for JUnit output.
type Suite
Suite_Data config specs builder
from project.Main.Spec import all
## PRIVATE
A group of behaviors for a test.
Arguments:
- name: The name of the spec.
- behaviors: The results of the behaviors encapsulated in that spec.
type Spec
Spec_Data name behaviors
from project.Main.Behavior import all
## PRIVATE
A description of a behaviors in a test.
Arguments:
- name: The name of the behavior.
- result: The result of the behavior.
- time_taken: The duration that the behaviour took to run.
type Behavior
Behavior_Data name result time_taken
## PRIVATE
Checks if the behavior is a failure.
Behavior.is_fail : Boolean
Behavior.is_fail self = self.result.is_fail
## PRIVATE
Checks if the spec group contains any failures and hence fails itself.
Spec.is_fail : Boolean
Spec.is_fail self = self.behaviors.any .is_fail
## PRIVATE
Checks if the suite contains any failures, and hence fails itself.
Suite.is_fail : Boolean
Suite.is_fail self = self.specs.any .is_fail
from project.Main.Finished_With_Error import all
## PRIVATE
An error describing that a test finished with an unexpected error.
Arguments:
- err: The payload of the error that triggered this error.
- stack_trace_text: A textual representation of the stack trace for the
error.
type Finished_With_Error
Finished_With_Error_Data err stack_trace_text
from project.Main.Assertion import all
from project.Main.Assertion export all
## PRIVATE
type Assertion
## PRIVATE
Represents a successful behavioral test.
Success
## PRIVATE
Represents a failing behavioral test.
Arguments:
- message: The reason why the test failed.
- details: Additional context of the error, for example the stack trace.
Failure message details
## PRIVATE
Represents a pending behavioral test.
Arguments:
- reason: Text describing why the test is pending.
Pending reason
## PRIVATE
Checks if the Assertion is a failure.
is_fail : Boolean
is_fail self = case self of
Success -> False
Failure _ _ -> True
Pending _ -> False
## PRIVATE
Executes a behavior test.
Arguments:
- behavior: The behavior to execute.
run_spec : Any -> Assertion
run_spec ~behavior =
recovery = Panic.recover Any <|
result = behavior
result.catch Any err->
Panic.throw (Finished_With_Error_Data err result.get_stack_trace_text)
Nothing
maybeExc = case recovery of
_ -> Success
result = maybeExc.catch Any ex->
case ex of
Failure _ _ -> ex
Finished_With_Error_Data err stack_trace_text ->
Failure ("An unexpected error was returned: " + err.to_text) details=stack_trace_text
_ -> Failure ("An unexpected panic was thrown: " + ex.to_text) details=maybeExc.get_stack_trace_text
result
## PRIVATE
Reports an unexpected dataflow error has occurred.
fail_match_on_unexpected_error : Error -> Integer -> Nothing
fail_match_on_unexpected_error error frames_to_skip =
payload = error.catch
loc = Meta.get_source_location 1+frames_to_skip
msg = "An unexpected dataflow error (" + payload.to_text + ") has been matched (at " + loc + ")."
fail msg+'\n'+error.get_stack_trace_text
## PRIVATE
Write the JUnit XML header.
wrap_junit_testsuites : Suite_Config -> (StringBuilder|Nothing) -> Any -> Nothing
wrap_junit_testsuites config builder ~action =
if config.should_output_junit then
builder.append '<?xml version="1.0" encoding="UTF-8"?>\n'
builder.append '<testsuites>\n'
result = action
if config.should_output_junit then
builder.append '</testsuites>\n'
config.output_path.parent.create_directory
builder.toString.write config.output_path
result
## PRIVATE
Record JUnit PENDING group.
report_pending_group : Text -> Text -> Suite_Config -> (StringBuilder|Nothing) -> Nothing
report_pending_group name reason config builder =
if config.should_output_junit then
builder.append (' <testsuite name="' + (escape_xml name) + '" timestamp="' + (Date_Time.now.format "yyyy-MM-dd'T'HH:mm:ss") + '" time="0">\n')
builder.append (' <testcase name="' + (escape_xml name) + '"><skipped message="' + (escape_xml reason) + '" /></testcase>\n')
builder.append ' </testsuite>\n'
IO.println ("[PENDING] " + name)
IO.println (" Reason: " + reason)
## PRIVATE
Prints a report on the tests to standard output.
Spec.print_report : Suite_Config -> (StringBuilder|Nothing) -> Nothing
Spec.print_report self config builder =
total_time = self.behaviors.fold Duration.zero acc-> behavior->
acc + behavior.time_taken
if config.should_output_junit then
builder.append (' <testsuite name="' + (escape_xml self.name) + '" timestamp="' + (Date_Time.now.format "yyyy-MM-dd'T'HH:mm:ss") + '"')
builder.append (' tests="' + self.behaviors.length.to_text + '"')
builder.append (' disabled="' + self.behaviors.filter (x->(x.is_a Pending)) . length . to_text + '"')
builder.append (' errors="' + self.behaviors.filter (x->(x.is_a Failure)) . length . to_text + '"')
builder.append (' time="' + (total_time.total_seconds).to_text + '"')
builder.append ('>\n')
self.behaviors.reverse.each behavior->
builder.append (' <testcase name="' + (escape_xml behavior.name) + '" time="' + ((behavior.time_taken.total_milliseconds / 1000.0).to_text) + '">')
case behavior.result of
Success -> Nothing
Failure msg details ->
escaped_message = escape_xml msg . replace '\n' '&#10;'
builder.append ('\n <error message="' + escaped_message + '">\n')
if details.is_nothing.not then
## We duplicate the message, because sometimes the
attribute is skipped if the node has any content.
builder.append (escape_xml msg)
builder.append '\n'
builder.append (escape_xml details)
builder.append '</error>\n'
Pending msg -> builder.append ('\n <skipped message="' + (escape_xml msg) + '"/>\n ')
builder.append '</testcase>\n'
builder.append ' </testsuite>\n'
should_print_behavior = config.print_only_failures.not || self.behaviors.any (b -> b.result.is_a Failure)
if should_print_behavior then
IO.println (self.name + ": [" + total_time.total_milliseconds.to_text + "ms]")
self.behaviors.reverse.each behavior->
case behavior.result of
Success ->
if config.print_only_failures.not then
IO.println (" - " + behavior.name + " [" + behavior.time_taken.total_milliseconds.to_text + "ms]")
Failure msg details ->
IO.println (" - [FAILED] " + behavior.name + " [" + behavior.time_taken.total_milliseconds.to_text + "ms]")
IO.println (" Reason: " + msg)
if details.is_nothing.not then
IO.println details
Pending reason ->
if config.print_only_failures.not then
IO.println (" - [PENDING] " + behavior.name)
IO.println (" Reason: " + reason)
## PRIVATE
Escape Text for XML
escape_xml : Text -> Text
escape_xml input =
input.replace '&' '&amp;' . replace '"' '&quot;' . replace "'" '&apos;' . replace '<' '&lt;' . replace '>' '&gt;'
import project.Bench.Bench
import project.Faker.Faker
import project.Problems
import project.Test_Suite.Test_Suite
import project.Test.Test
import project.Extensions
export project.Bench.Bench
export project.Faker.Faker
export project.Problems
export project.Test_Suite.Test_Suite
export project.Test.Test
export project.Extensions

View File

@ -1,6 +1,6 @@
from Standard.Base import all
import Standard.Test
import project.Extensions
## UNSTABLE
Tests how a specific operation behaves depending on the requested

View File

@ -0,0 +1,60 @@
from Standard.Base import all
polyglot java import java.lang.NullPointerException
## PRIVATE
find_project_root : File -> File
find_project_root path =
if path.is_nothing then Nothing else
handler _ = Nothing
Panic.catch NullPointerException handler=handler <|
if path.name == "src" then path.parent else
@Tail_Call find_project_root path.parent
## PRIVATE
find_caller_script : [Stack_Trace_Element] -> File
find_caller_script stack =
find_main idx =
if stack.at idx . name == "Test_Suite.type.run_main" then idx else
@Tail_Call find_main (idx + 1)
main_index = find_main 0
find_caller idx =
source = stack.at idx . source_location
if source.is_a Source_Location_Data then stack.at idx . source_location . file else
if (idx + 1 == stack.length) then Nothing else
@Tail_Call find_caller (idx + 1)
find_caller (main_index + 1)
## Holds configuration for a Test_Suite
type Suite_Config
## Creates an Suite_Config based off environment and caller location
from_environment : Suite_Config
from_environment =
only_group_regexp = Environment.get "TEST_ONLY_GROUP"
print_only_failures = Environment.get "REPORT_ONLY_FAILED" != Nothing
junit_folder = Environment.get "ENSO_TEST_JUNIT_DIR"
results_path = if junit_folder.is_nothing then Nothing else
caller_script = find_caller_script Runtime.get_stack_trace
project_root = find_project_root caller_script
case project_root.is_nothing of
True ->
IO.println "Unable to determine root project path. JUnit output disabled."
Nothing
False ->
(File.new junit_folder) / project_root.name / "JUnit.xml"
Suite_Config.Value only_group_regexp print_only_failures results_path
## PRIVATE - construct a configuration
Value only_group_regexp print_only_failures output_path
should_run_group self name =
regexp = self.only_group_regexp
case regexp of
_ : Text -> name.matches regexp . catch Any (_->True)
_ -> True
should_output_junit self =
self.output_path.is_nothing.not

View File

@ -0,0 +1,209 @@
from Standard.Base import all
import Standard.Base.Runtime.State
import Standard.Base.Data.Time.Duration
import project.Test_Reporter
import project.Test_Result.Test_Result
import project.Test_Suite.Test_Suite
type Test
## Creates a new test group, describing properties of the object
described by `self`.
Arguments:
- name: The name of the test group.
- behaviors: An action containing a set of specs for the group.
- pending: A reason for why the test is pending, or `Nothing` when it is not
pending.
> Example
Adding a test group.
from Standard.Test import Test, Test_Suite
example_group = Test_Suite.run <|
Test.group "Number" <| Nothing
group : Text -> Any -> (Text | Nothing) -> Nothing
group name ~behaviors pending=Nothing =
suite = State.get Test_Suite
config = suite.config
if config.should_run_group name then
case pending of
Nothing ->
r = State.run Spec (Spec.Value name Nil) <|
behaviors
State.get Spec
Test_Reporter.print_report r config suite.builder
new_suite = Test_Suite.Value suite.config (Cons r suite.specs) suite.builder
State.put Test_Suite new_suite
reason ->
Test_Reporter.report_pending_group name reason config suite.builder
## Specifies a single behavior, described by `self`.
Arguments:
- label: A description of the behavior being tested.
- behavior: An action that executes tests.
- pending: A reason for why the test is pending, or `Nothing` when it is not
pending.
> Example
Adding a specification to the test group.
from Standard.Test import Test, Test_Suite
example_group = Test_Suite.run <|
Test.group "Number" <|
Test.specify "should define addition" <|
2+3 . should_equal 5
> Example
Adding a pending specification to the test group.
from Standard.Test import Test, Test_Suite
example_group = Test_Suite.run <|
Test.group "Number" <|
Test.specify "should define addition" pending="Reason" <|
2+3 . should_equal 5
specify : Text -> Any -> (Text | Nothing) -> Nothing
specify label ~behavior pending=Nothing =
pair = case pending of
Nothing -> Duration.time_execution (run_spec behavior)
reason -> Pair_Data Duration.zero (Test_Result.Pending reason)
result = pair.second
time_taken = pair.first
spec = State.get Spec
new_spec = Spec.Value spec.name (Cons (Behavior.Value label result time_taken) spec.behaviors)
State.put Spec new_spec
## Expect a function to fail with the provided panic.
Arguments:
- action: The action to evaluate that is expected to fail with a panic.
- matcher: The expected type of the panic thrown by `action`.
> Example
Expect that a computation should panic as part of a test.
import Standard.Examples
from Standard.Test import Test
example_expect_panic_with =
Test.expect_panic_with Examples.throw_panic Examples.My_Error
expect_panic_with : Any -> Any -> Test_Result
expect_panic_with ~action matcher =
res = Panic.recover Any action
case res of
_ ->
loc = Meta.get_source_location 2
return_suffix = if res.is_nothing then "" else "and returned ["+res.to_text+"]"
Test.fail ("Expected a " + matcher.to_text + " to be thrown, but the action succeeded " + return_suffix + " (at "+loc+").")
err = res.catch
if err.is_a matcher then Nothing else
Test.fail ("Expected a " + matcher.to_text + ", but " + err.to_text + " was thrown instead.")
## Checks that the provided action returns without any errors or warnings.
If you just want to check for errors, usage of the `.should_succeed`
extension function is preferred.
assert_no_problems value frames_to_skip=0 =
value.catch Any _->
Test.fail_match_on_unexpected_error value 2+frames_to_skip
warnings = Warning.get_all value . map .value
if warnings.not_empty then
loc = Meta.get_source_location 2+frames_to_skip
msg = "The action returned unexpected warnings: " + warnings.to_text + " (at " + loc + ")."
Test.fail msg
## Fail a test with the given message.
Arguments:
- message: The message printed when failing the test.
> Example
Failing a test manually.
from Standard.Test import Test
example_fail = Test.fail "Something went wrong."
fail : Text -> Test_Result
fail message details=Nothing =
failure = Test_Result.Failure message details
Panic.throw failure
## PRIVATE
Reports an unexpected dataflow error has occurred.
fail_match_on_unexpected_error : Error -> Integer -> Nothing
fail_match_on_unexpected_error error frames_to_skip =
payload = error.catch
loc = Meta.get_source_location 1+frames_to_skip
msg = "An unexpected dataflow error (" + payload.to_text + ") has been matched (at " + loc + ")."
Test.fail msg+'\n'+error.get_stack_trace_text
## PRIVATE
Executes a behavior test.
Arguments:
- behavior: The behavior to execute.
run_spec : Any -> Test_Result
run_spec ~behavior =
recovery = Panic.recover Any <|
result = behavior
result.catch Any err->
Panic.throw (Finished_With.Error err result.get_stack_trace_text)
Nothing
maybeExc = case recovery of
_ -> Test_Result.Success
result = maybeExc.catch Any ex->
case ex of
Test_Result.Failure _ _ -> ex
Finished_With.Error err stack_trace_text ->
Test_Result.Failure ("An unexpected error was returned: " + err.to_text) details=stack_trace_text
_ -> Test_Result.Failure ("An unexpected panic was thrown: " + ex.to_text) details=maybeExc.get_stack_trace_text
result
## PRIVATE
An error describing that a test finished with an unexpected error.
Arguments:
- err: The payload of the error that triggered this error.
- stack_trace_text: A textual representation of the stack trace for the
error.
type Finished_With
Error err stack_trace_text
## PRIVATE
A group of behaviors for a test.
Arguments:
- name: The name of the spec.
- behaviors: The results of the behaviors encapsulated in that spec.
type Spec
Value name behaviors
## PRIVATE
Checks if the spec group contains any failures and hence fails itself.
is_fail : Boolean
is_fail self = self.behaviors.any .is_fail
## PRIVATE
A description of a behaviors in a test.
Arguments:
- name: The name of the behavior.
- result: The result of the behavior.
- time_taken: The duration that the behaviour took to run.
type Behavior
Value name result time_taken
## PRIVATE
Checks if the behavior is a failure.
is_fail : Boolean
is_fail self = self.result.is_fail

View File

@ -0,0 +1,92 @@
from Standard.Base import all
import Standard.Base.Data.Time.Duration
import project.Suite_Config.Suite_Config
import project.Test_Result.Test_Result
polyglot java import java.lang.StringBuilder
## PRIVATE
Write the JUnit XML header.
wrap_junit_testsuites : Suite_Config -> (StringBuilder|Nothing) -> Any -> Nothing
wrap_junit_testsuites config builder ~action =
if config.should_output_junit then
builder.append '<?xml version="1.0" encoding="UTF-8"?>\n'
builder.append '<testsuites>\n'
result = action
if config.should_output_junit then
builder.append '</testsuites>\n'
config.output_path.parent.create_directory
builder.toString.write config.output_path
result
## PRIVATE
Prints a report on the tests to standard output.
print_report : Spec -> Suite_Config -> (StringBuilder|Nothing) -> Nothing
print_report spec config builder =
total_time = spec.behaviors.fold Duration.zero acc-> behavior->
acc + behavior.time_taken
if config.should_output_junit then
builder.append (' <testsuite name="' + (escape_xml spec.name) + '" timestamp="' + (Date_Time.now.format "yyyy-MM-dd'T'HH:mm:ss") + '"')
builder.append (' tests="' + spec.behaviors.length.to_text + '"')
builder.append (' disabled="' + spec.behaviors.filter (x->(x.is_a Test_Result.Pending)) . length . to_text + '"')
builder.append (' errors="' + spec.behaviors.filter (x->(x.is_a Test_Result.Failure)) . length . to_text + '"')
builder.append (' time="' + total_time.total_seconds.to_text + '"')
builder.append ('>\n')
spec.behaviors.reverse.each behavior->
builder.append (' <testcase name="' + (escape_xml behavior.name) + '" time="' + ((behavior.time_taken.total_milliseconds / 1000.0).to_text) + '">')
case behavior.result of
Test_Result.Success -> Nothing
Test_Result.Failure msg details ->
escaped_message = escape_xml msg . replace '\n' '&#10;'
builder.append ('\n <error message="' + escaped_message + '">\n')
if details.is_nothing.not then
## We duplicate the message, because sometimes the
attribute is skipped if the node has any content.
builder.append (escape_xml msg)
builder.append '\n'
builder.append (escape_xml details)
builder.append '</error>\n'
Test_Result.Pending msg -> builder.append ('\n <skipped message="' + (escape_xml msg) + '"/>\n ')
builder.append '</testcase>\n'
builder.append ' </testsuite>\n'
should_print_behavior = config.print_only_failures.not || spec.behaviors.any (b -> b.result.is_a Test_Result.Failure)
if should_print_behavior then
IO.println (spec.name + ": [" + total_time.total_milliseconds.to_text + "ms]")
spec.behaviors.reverse.each behavior->
case behavior.result of
Test_Result.Success ->
if config.print_only_failures.not then
IO.println (" - " + behavior.name + " [" + behavior.time_taken.total_milliseconds.to_text + "ms]")
Test_Result.Failure msg details ->
IO.println (" - [FAILED] " + behavior.name + " [" + behavior.time_taken.total_milliseconds.to_text + "ms]")
IO.println (" Reason: " + msg)
if details.is_nothing.not then
IO.println details
Test_Result.Pending reason ->
if config.print_only_failures.not then
IO.println (" - [PENDING] " + behavior.name)
IO.println (" Reason: " + reason)
## PRIVATE
Record JUnit PENDING group.
report_pending_group : Text -> Text -> Suite_Config -> (StringBuilder|Nothing) -> Nothing
report_pending_group name reason config builder =
if config.should_output_junit then
builder.append (' <testsuite name="' + (escape_xml name) + '" timestamp="' + (Date_Time.now.format "yyyy-MM-dd'T'HH:mm:ss") + '" time="0">\n')
builder.append (' <testcase name="' + (escape_xml name) + '"><skipped message="' + (escape_xml reason) + '" /></testcase>\n')
builder.append ' </testsuite>\n'
IO.println ("[PENDING] " + name)
IO.println (" Reason: " + reason)
## PRIVATE
Escape Text for XML
escape_xml : Text -> Text
escape_xml input =
input.replace '&' '&amp;' . replace '"' '&quot;' . replace "'" '&apos;' . replace '<' '&lt;' . replace '>' '&gt;'

View File

@ -0,0 +1,24 @@
from Standard.Base import all
type Test_Result
## Represents a successful behavioral test.
Success
## Represents a failing behavioral test.
Arguments:
- message: The reason why the test failed.
- details: Additional context of the error, for example the stack trace.
Failure message details
## Represents a pending behavioral test.
Arguments:
- reason: Text describing why the test is pending.
Pending reason
## Checks if the Test_Result is a failure.
is_fail : Boolean
is_fail self = case self of
Test_Result.Failure _ _ -> True
_ -> False

View File

@ -0,0 +1,75 @@
from Standard.Base import all
import Standard.Base.Data.Time.Duration
import Standard.Base.Runtime.State
import Standard.Base.System
import project.Suite_Config.Suite_Config
import project.Test_Reporter
polyglot java import java.lang.StringBuilder
type Test_Suite
## PRIVATE
The top-level entry point for a test suite.
Arguments:
- config: Suite_Config controlloing the test run.
- specs: The specs contained within the test suite.
- builder: StringBuilder for JUnit output.
Value config specs builder
## Creates a new test group, describing properties of the object
described by `self`.
Arguments:
- specs: An action encapsulating a number of test specs or groups.
> Example
Building a basic test suite.
from Standard.Test import Test, Test_Suite
example_run_main = Test_Suite.run_main <|
Test.group "Number" <|
Test.specify "should define addition" <|
2+3 . should_equal 5
Test.specify "should define multiplication" <|
2*3 . should_equal 6
run_main : Any -> Nothing
run_main ~specs =
config = Suite_Config.from_environment
r = Test_Suite.run specs config
code = if r.is_fail then 1 else 0
System.exit code
## Creates a new test group, describing properties of the object
described by `self`.
Arguments:
- specs: An action encapsulating a number of test specs or groups.
> Example
Building a basic test suite.
from Standard.Test import Test, Test_Suite
example_run = Test_Suite.run <|
Test.group "Number" <|
Test.specify "should define addition" <|
2+3 . should_equal 5
Test.specify "should define multiplication" <|
2*3 . should_equal 6
run : Any -> Suite_Config -> Any
run ~specs config =
builder = if config.should_output_junit then StringBuilder.new else Nothing
Test_Reporter.wrap_junit_testsuites config builder <|
State.run Test_Suite (Test_Suite.Value config Nil builder) <|
specs
State.get Test_Suite
## PRIVATE
Checks if the suite contains any failures, and hence fails itself.
is_fail : Boolean
is_fail self = self.specs.any .is_fail

View File

@ -1,6 +1,6 @@
from Standard.Base import all
import Standard.Test.Bench
from Standard.Test import Bench
polyglot java import java.util.Random

View File

@ -1,7 +1,7 @@
from Standard.Base import all
import Standard.Base.Data.Time.Duration
import Standard.Test.Bench
from Standard.Test import Bench
polyglot java import java.util.Random
polyglot java import org.graalvm.collections.Pair as Graal_Pair

View File

@ -1,6 +1,6 @@
from Standard.Base import all
import Standard.Test.Bench
from Standard.Test import Bench
prep_json size =
single = '{"foo": 543}, {"bar": false}'

View File

@ -2,7 +2,7 @@ from Standard.Base import all
import Standard.Base.Runtime.Debug
import Standard.Base.Runtime.State
import Standard.Test.Bench
from Standard.Test import Bench
polyglot java import java.lang.Long

View File

@ -1,7 +1,6 @@
from Standard.Base import all
import Standard.Test.Bench
import Standard.Test.Faker
from Standard.Test import Bench, Faker
## Bench Utilities ============================================================

View File

@ -1,7 +1,6 @@
from Standard.Base import all
import Standard.Test.Bench
import Standard.Test.Faker
from Standard.Test import Bench, Faker
## Bench Utilities ============================================================

View File

@ -1,8 +1,7 @@
from Standard.Base import IO, Integer, Vector, Statistics
from Standard.Base.Data.Statistics import all
import Standard.Test.Bench
import Standard.Test.Faker
from Standard.Test import Bench, Faker
## Bench Utilities ============================================================

View File

@ -3,8 +3,7 @@ from Standard.Base import all
from Standard.Table import Table, Column_Selector
from Standard.Table.Data.Aggregate_Column import all
import Standard.Test.Bench
import Standard.Test.Faker
from Standard.Test import Bench, Faker
## Bench Utilities ============================================================

View File

@ -5,7 +5,7 @@ import Standard.Base.Data.Time.Duration
from Standard.Table import Table, Sort_Column_Selector
from Standard.Table.Data.Aggregate_Column import all
import Standard.Test.Bench
from Standard.Test import Bench
type My
Data x

View File

@ -1,7 +1,7 @@
from Standard.Base import all
import Standard.Base.Data.Text.Prim_Text_Helper
import Standard.Test.Bench
from Standard.Test import Bench
polyglot java import java.lang.StringBuilder

View File

@ -1,7 +1,6 @@
from Standard.Base import all
import Standard.Test.Bench
import Standard.Test.Faker
from Standard.Test import Bench, Faker
compare_all_adjacent text_vector =
res = 1.up_to text_vector.length . fold False acc-> ix->

View File

@ -1,7 +1,6 @@
from Standard.Base import all
import Standard.Test.Bench
import Standard.Test.Faker
from Standard.Test import Bench, Faker
check_all text_vector pattern_vector mode =
text_vector.fold 0 acc-> text->

View File

@ -1,7 +1,6 @@
from Standard.Base import all
import Standard.Test.Bench
import Standard.Test.Faker
from Standard.Test import Bench, Faker
# Benchmarks ##################################################################

View File

@ -2,7 +2,7 @@ from Standard.Base import all
from Standard.Base.Data.Index_Sub_Range import Sample
import Standard.Base.Data.Time.Duration
import Standard.Test.Bench
from Standard.Test import Bench
polyglot java import java.util.Random

View File

@ -1,7 +1,7 @@
from Standard.Base import all
import Standard.Base
import Standard.Test.Bench
from Standard.Test import Bench
polyglot java import java.util.Random
polyglot java import org.enso.base.Time_Utils

View File

@ -1,7 +1,7 @@
from Standard.Base import all
import Standard.Base.Runtime.Ref
import Standard.Test.Bench
from Standard.Test import Bench
import project.Vector.Vector as Vector_Utils

View File

@ -1,7 +1,7 @@
from Standard.Base import all
import Standard.Base
import Standard.Test.Bench
from Standard.Test import Bench
polyglot java import java.util.Random
polyglot java import org.enso.base.Time_Utils

View File

@ -2,7 +2,7 @@ from Standard.Base import all
import Standard.Examples
import Standard.Test
from Standard.Test import Test, Test_Suite
# While we're lacking the ability to run the documentation examples
# automatically (#1706), these tests at least check that each of the examples
@ -10,8 +10,8 @@ import Standard.Test
spec = Test.group "Examples" <|
Test.specify "should allow construction of Example_Error_Type" <|
val = Examples.Example_Error_Type_Data "Oh, no! Something went wrong!"
val.should_be_an Examples.Example_Error_Type_Data
val = Examples.Example_Error_Type.Error "Oh, no! Something went wrong!"
val.should_be_an Examples.Example_Error_Type.Error
Test.specify "should allow getting the examples data directory" <|
dir = Examples.data_dir
@ -58,13 +58,13 @@ spec = Test.group "Examples" <|
Examples.no_such_method
Test.specify "should provide a dummy error type" <|
Examples.My_Error_Data
Examples.My_Error.Error
Test.specify "should provide a method that throws an error" <|
Examples.throw_error.should_fail_with Examples.My_Error_Data
Examples.throw_error.should_fail_with Examples.My_Error.Error
Test.specify "should provide a method that throws a panic" <|
Test.expect_panic_with Examples.throw_panic Examples.My_Error_Data
Test.expect_panic_with Examples.throw_panic Examples.My_Error.Error
Test.specify "should provide a URL for some geo data" <|
(Examples.geo_data_url.length > 0) . should_be_true
@ -121,4 +121,4 @@ spec = Test.group "Examples" <|
match.groups.length . should_equal 5
match.named_groups.size . should_equal 2
main = Test.Suite.run_main spec
main = Test_Suite.run_main spec

View File

@ -1,8 +1,8 @@
from Standard.Base import all
import Standard.Test
from Standard.Test import Test_Suite
import project.Examples_Spec
main = Test.Suite.run_main <|
main = Test_Suite.run_main <|
Examples_Spec.spec

View File

@ -3,7 +3,7 @@ from Standard.Table.Data.Table.Table import Table_Data
import Standard.Geo
import Standard.Test
from Standard.Test import Test
spec =
Test.group "Geo Points" <|

View File

@ -1,8 +1,8 @@
from Standard.Base import all
import Standard.Test
from Standard.Test import Test_Suite
import project.Geo_Spec
main = Test.Suite.run_main <|
main = Test_Suite.run_main <|
Geo_Spec.spec

View File

@ -1,9 +1,9 @@
from Standard.Base import all
import Standard.Google_Api
import Standard.Test
from Standard.Test import Test, Test_Suite
main = Test.Suite.run_main <|
main = Test_Suite.run_main <|
secret = enso_project.data / 'secret.json'
api = Google_Api.initialize secret

View File

@ -1,9 +1,9 @@
from Standard.Base import all
import Standard.Image.Data.Image
import Standard.Image.Data.Matrix
from Standard.Image import Image, Matrix
import Standard.Image.Data.Matrix_Error.Matrix_Error
import Standard.Test
from Standard.Test import Test, Test_Suite
spec =
Test.group "Image with 1 channel" <|
@ -30,8 +30,8 @@ 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.Index_Out_Of_Bounds_Error
identity.get -1 -1 . should_fail_with Matrix.Index_Out_Of_Bounds_Error
identity.get 10 10 . should_fail_with Matrix_Error.Index_Out_Of_Bounds_Error
identity.get -1 -1 . should_fail_with Matrix_Error.Index_Out_Of_Bounds_Error
Test.specify "should be able to add a scalar" <|
zeros+1 . should_equal ones
@ -50,7 +50,7 @@ spec =
(zeros + (zeros+0.8).to_matrix) . should_equal zeros+0.8
Test.specify "should fail to add a matrix with mismatched dimensions" <|
o = Matrix.ones 2 3
zeros+o . should_fail_with Matrix.Dimensions_Not_Equal
zeros+o . should_fail_with Matrix_Error.Dimensions_Not_Equal
Test.specify "should be able to subtract a scalar" <|
ones-1 . should_equal zeros
@ -67,7 +67,7 @@ spec =
(ones - (zeros+0.8).to_matrix) . should_equal ones-0.8
Test.specify "should fail to subtract a matrix with mismatched dimensions" <|
o = Matrix.ones 2 3
zeros-o . should_fail_with Matrix.Dimensions_Not_Equal
zeros-o . should_fail_with Matrix_Error.Dimensions_Not_Equal
Test.specify "should be able to multiply by a scalar" <|
ones*2 . should_equal ones
@ -85,7 +85,7 @@ spec =
(ones * (zeros-0.8).to_matrix) . should_equal zeros-0.8
Test.specify "should fail to multiply by a matrix with mismatched dimensions" <|
o = Matrix.ones 2 3
zeros*o . should_fail_with Matrix.Dimensions_Not_Equal
zeros*o . should_fail_with Matrix_Error.Dimensions_Not_Equal
Test.specify "should be able to divide by a scalar" <|
zeros/2 . should_equal zeros
@ -100,7 +100,7 @@ spec =
(ones / fives) . should_equal (Image.from_vector (Vector.fill 9 0.2) channels=1 rows=3)
Test.specify "should fail to divide by a matrix with mismatched dimensions" <|
o = Matrix.ones 2 3
zeros/o . should_fail_with Matrix.Dimensions_Not_Equal
zeros/o . should_fail_with Matrix_Error.Dimensions_Not_Equal
Test.group "Image with 2 channels" <|
zeros = Image.from_vector (Vector.fill 9 0 . flat_map x->[x,x]) rows=3 channels=2
@ -125,8 +125,8 @@ 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.Index_Out_Of_Bounds_Error
identity.get -1 -1 . should_fail_with Matrix.Index_Out_Of_Bounds_Error
identity.get 10 10 . should_fail_with Matrix_Error.Index_Out_Of_Bounds_Error
identity.get -1 -1 . should_fail_with Matrix_Error.Index_Out_Of_Bounds_Error
Test.specify "should be able to add a scalar" <|
zeros+1 . should_equal ones
@ -145,7 +145,7 @@ spec =
(zeros + (zeros+0.8).to_matrix) . should_equal zeros+0.8
Test.specify "should fail to add a matrix with mismatched dimensions" <|
o = Matrix.ones 2 3
zeros+o . should_fail_with Matrix.Dimensions_Not_Equal
zeros+o . should_fail_with Matrix_Error.Dimensions_Not_Equal
Test.specify "should be able to subtract a scalar" <|
ones-1 . should_equal zeros
@ -162,7 +162,7 @@ spec =
(ones - (zeros+0.8).to_matrix) . should_equal ones-0.8
Test.specify "should fail to subtract a matrix with mismatched dimensions" <|
o = Matrix.ones 2 3
zeros-o . should_fail_with Matrix.Dimensions_Not_Equal
zeros-o . should_fail_with Matrix_Error.Dimensions_Not_Equal
Test.specify "should be able to multiply by a scalar" <|
ones*2 . should_equal ones
@ -180,7 +180,7 @@ spec =
(ones * (zeros-0.8).to_matrix) . should_equal zeros-0.8
Test.specify "should fail to multiply by a matrix with mismatched dimensions" <|
o = Matrix.ones 2 3
zeros*o . should_fail_with Matrix.Dimensions_Not_Equal
zeros*o . should_fail_with Matrix_Error.Dimensions_Not_Equal
Test.specify "should be able to divide by a scalar" <|
zeros/2 . should_equal zeros
@ -195,7 +195,7 @@ spec =
(ones / fives) . should_equal (Image.from_vector (Vector.fill 9*2 0.2) channels=2 rows=3)
Test.specify "should fail to divide by a matrix with mismatched dimensions" <|
o = Matrix.ones 2 3
zeros/o . should_fail_with Matrix.Dimensions_Not_Equal
zeros/o . should_fail_with Matrix_Error.Dimensions_Not_Equal
Test.group "Image with 3 channels" <|
zeros = Image.from_vector (Vector.fill 9 0 . flat_map x->[x,x,x]) rows=3 channels=3
@ -221,8 +221,8 @@ 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.Index_Out_Of_Bounds_Error
identity.get -1 -1 . should_fail_with Matrix.Index_Out_Of_Bounds_Error
identity.get 10 10 . should_fail_with Matrix_Error.Index_Out_Of_Bounds_Error
identity.get -1 -1 . should_fail_with Matrix_Error.Index_Out_Of_Bounds_Error
Test.specify "should be able to add a scalar" <|
zeros+1 . should_equal ones
@ -241,7 +241,7 @@ spec =
(zeros + (zeros+0.8).to_matrix) . should_equal zeros+0.8
Test.specify "should fail to add a matrix with mismatched dimensions" <|
o = Matrix.ones 2 3
zeros+o . should_fail_with Matrix.Dimensions_Not_Equal
zeros+o . should_fail_with Matrix_Error.Dimensions_Not_Equal
Test.specify "should be able to subtract a scalar" <|
ones-1 . should_equal zeros
@ -258,7 +258,7 @@ spec =
(ones - (zeros+0.8).to_matrix) . should_equal ones-0.8
Test.specify "should fail to subtract a matrix with mismatched dimensions" <|
o = Matrix.ones 2 3
zeros-o . should_fail_with Matrix.Dimensions_Not_Equal
zeros-o . should_fail_with Matrix_Error.Dimensions_Not_Equal
Test.specify "should be able to multiply by a scalar" <|
ones*2 . should_equal ones
@ -276,7 +276,7 @@ spec =
(ones * (zeros-0.8).to_matrix) . should_equal zeros-0.8
Test.specify "should fail to multiply by a matrix with mismatched dimensions" <|
o = Matrix.ones 2 3
zeros*o . should_fail_with Matrix.Dimensions_Not_Equal
zeros*o . should_fail_with Matrix_Error.Dimensions_Not_Equal
Test.specify "should be able to divide by a scalar" <|
zeros/2 . should_equal zeros
@ -291,7 +291,7 @@ spec =
(ones / fives) . should_equal (Image.from_vector (Vector.fill 9*3 0.2) channels=3 rows=3)
Test.specify "should fail to divide by a matrix with mismatched dimensions" <|
o = Matrix.ones 2 3
zeros/o . should_fail_with Matrix.Dimensions_Not_Equal
zeros/o . should_fail_with Matrix_Error.Dimensions_Not_Equal
Test.group "Image with 4 channels" <|
zeros = Image.from_vector (Vector.fill 9 0 . flat_map x->[x,x,x,x]) rows=3 channels=4
@ -317,8 +317,8 @@ 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.Index_Out_Of_Bounds_Error
identity.get -1 -1 . should_fail_with Matrix.Index_Out_Of_Bounds_Error
identity.get 10 10 . should_fail_with Matrix_Error.Index_Out_Of_Bounds_Error
identity.get -1 -1 . should_fail_with Matrix_Error.Index_Out_Of_Bounds_Error
Test.specify "should be able to add a scalar" <|
zeros+1 . should_equal ones
@ -337,7 +337,7 @@ spec =
(zeros + (zeros+0.8).to_matrix) . should_equal zeros+0.8
Test.specify "should fail to add a matrix with mismatched dimensions" <|
o = Matrix.ones 2 3
zeros+o . should_fail_with Matrix.Dimensions_Not_Equal
zeros+o . should_fail_with Matrix_Error.Dimensions_Not_Equal
Test.specify "should be able to subtract a scalar" <|
ones-1 . should_equal zeros
@ -354,7 +354,7 @@ spec =
(ones - (zeros+0.8).to_matrix) . should_equal ones-0.8
Test.specify "should fail to subtract a matrix with mismatched dimensions" <|
o = Matrix.ones 2 3
zeros-o . should_fail_with Matrix.Dimensions_Not_Equal
zeros-o . should_fail_with Matrix_Error.Dimensions_Not_Equal
Test.specify "should be able to multiply by a scalar" <|
ones*2 . should_equal ones
@ -372,7 +372,7 @@ spec =
(ones * (zeros-0.8).to_matrix) . should_equal zeros-0.8
Test.specify "should fail to multiply by a matrix with mismatched dimensions" <|
o = Matrix.ones 2 3
zeros*o . should_fail_with Matrix.Dimensions_Not_Equal
zeros*o . should_fail_with Matrix_Error.Dimensions_Not_Equal
Test.specify "should be able to divide by a scalar" <|
zeros/2 . should_equal zeros
@ -387,4 +387,6 @@ spec =
(ones / fives) . should_equal (Image.from_vector (Vector.fill 9*4 0.2) channels=4 rows=3)
Test.specify "should fail to divide by a matrix with mismatched dimensions" <|
o = Matrix.ones 2 3
zeros/o . should_fail_with Matrix.Dimensions_Not_Equal
zeros/o . should_fail_with Matrix_Error.Dimensions_Not_Equal
main = Test_Suite.run_main spec

View File

@ -1,15 +1,16 @@
from Standard.Base import all
import Standard.Image.Data.Matrix
from Standard.Image import Matrix
import Standard.Image.Data.Matrix_Error.Matrix_Error
import Standard.Test
from Standard.Test import Test, Test_Suite
spec =
Test.group "Matrix_Error" <|
Test.specify "should display errors" <|
(Matrix.Index_Out_Of_Bounds_Error 2 3 4).to_display_text . should_equal '''
(Matrix_Error.Index_Out_Of_Bounds_Error 2 3 4).to_display_text . should_equal '''
For a matrix with dimensions 2x3, the index 4 is out of bounds.
Matrix.Dimensions_Not_Equal.to_display_text . should_equal '''
Matrix_Error.Dimensions_Not_Equal.to_display_text . should_equal '''
Dimensions are not equal.
Test.group "Matrix with 1 channel" <|
zeros = Matrix.zeros 3 3
@ -40,8 +41,8 @@ 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.Index_Out_Of_Bounds_Error
identity.get -1 -1 . should_fail_with Matrix.Index_Out_Of_Bounds_Error
identity.get 10 10 . should_fail_with Matrix_Error.Index_Out_Of_Bounds_Error
identity.get -1 -1 . should_fail_with Matrix_Error.Index_Out_Of_Bounds_Error
Test.specify "should be able to add a scalar" <|
zeros+1 . should_equal ones
@ -58,7 +59,7 @@ spec =
ones+ones . should_equal twos
Test.specify "should fail to add a matrix with mismatched dimensions" <|
o = Matrix.ones 2 3
zeros+o . should_fail_with Matrix.Dimensions_Not_Equal
zeros+o . should_fail_with Matrix_Error.Dimensions_Not_Equal
Test.specify "should be able to subtract a scalar" <|
ones-1 . should_equal zeros
@ -75,7 +76,7 @@ spec =
identity-zeros . should_equal identity
Test.specify "should fail to subtract a matrix with mismatched dimensions" <|
o = Matrix.ones 2 3
zeros-o . should_fail_with Matrix.Dimensions_Not_Equal
zeros-o . should_fail_with Matrix_Error.Dimensions_Not_Equal
Test.specify "should be able to multiply by a scalar" <|
ones*2 . should_equal twos
@ -93,7 +94,7 @@ spec =
identity*zeros . should_equal zeros
Test.specify "should fail to multiply by a matrix with mismatched dimensions" <|
o = Matrix.ones 2 3
zeros*o . should_fail_with Matrix.Dimensions_Not_Equal
zeros*o . should_fail_with Matrix_Error.Dimensions_Not_Equal
Test.specify "should be able to divide by a scalar" <|
zeros/2 . should_equal zeros
@ -108,7 +109,7 @@ spec =
twos/twos . should_equal ones
Test.specify "should fail to divide by a matrix with mismatched dimensions" <|
o = Matrix.ones 2 3
zeros/o . should_fail_with Matrix.Dimensions_Not_Equal
zeros/o . should_fail_with Matrix_Error.Dimensions_Not_Equal
Test.group "Matrix with 2 channels" <|
zeros = Matrix.zeros 3 3 channels=2
@ -138,8 +139,8 @@ 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.Index_Out_Of_Bounds_Error
identity.get -1 -1 . should_fail_with Matrix.Index_Out_Of_Bounds_Error
identity.get 10 10 . should_fail_with Matrix_Error.Index_Out_Of_Bounds_Error
identity.get -1 -1 . should_fail_with Matrix_Error.Index_Out_Of_Bounds_Error
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)
@ -157,7 +158,7 @@ spec =
ones+ones . should_equal twos
Test.specify "should fail to add a matrix with mismatched dimensions" <|
o = Matrix.ones 2 3
zeros+o . should_fail_with Matrix.Dimensions_Not_Equal
zeros+o . should_fail_with Matrix_Error.Dimensions_Not_Equal
Test.specify "should be able to subtract a scalar" <|
ones-1 . should_equal (Matrix.from_vector (ones.to_vector . map (_ - 1)) rows=3 channels=2)
@ -174,7 +175,7 @@ spec =
identity-zeros . should_equal identity
Test.specify "should fail to subtract a matrix with mismatched dimensions" <|
o = Matrix.ones 2 3
zeros-o . should_fail_with Matrix.Dimensions_Not_Equal
zeros-o . should_fail_with Matrix_Error.Dimensions_Not_Equal
Test.specify "should be able to multiply by a scalar" <|
ones*2 . should_equal twos
@ -192,7 +193,7 @@ spec =
identity*zeros . should_equal zeros
Test.specify "should fail to multiply by a matrix with mismatched dimensions" <|
o = Matrix.ones 2 3
zeros*o . should_fail_with Matrix.Dimensions_Not_Equal
zeros*o . should_fail_with Matrix_Error.Dimensions_Not_Equal
Test.specify "should be able to divide by a scalar" <|
zeros/2 . should_equal zeros
@ -209,7 +210,7 @@ spec =
twos/all_twos . should_equal ones
Test.specify "should fail to divide by a matrix with mismatched dimensions" <|
o = Matrix.ones 2 3
zeros/o . should_fail_with Matrix.Dimensions_Not_Equal
zeros/o . should_fail_with Matrix_Error.Dimensions_Not_Equal
Test.group "Matrix with 3 channels" <|
zeros = Matrix.zeros 3 3 channels=3
@ -239,8 +240,8 @@ 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.Index_Out_Of_Bounds_Error
identity.get -1 -1 . should_fail_with Matrix.Index_Out_Of_Bounds_Error
identity.get 10 10 . should_fail_with Matrix_Error.Index_Out_Of_Bounds_Error
identity.get -1 -1 . should_fail_with Matrix_Error.Index_Out_Of_Bounds_Error
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)
@ -258,7 +259,7 @@ spec =
ones+ones . should_equal twos
Test.specify "should fail to add a matrix with mismatched dimensions" <|
o = Matrix.ones 2 3
zeros+o . should_fail_with Matrix.Dimensions_Not_Equal
zeros+o . should_fail_with Matrix_Error.Dimensions_Not_Equal
Test.specify "should be able to subtract a scalar" <|
ones-1 . should_equal (Matrix.from_vector (ones.to_vector . map (_ - 1)) rows=3 channels=3)
@ -275,7 +276,7 @@ spec =
identity-zeros . should_equal identity
Test.specify "should fail to subtract a matrix with mismatched dimensions" <|
o = Matrix.ones 2 3
zeros-o . should_fail_with Matrix.Dimensions_Not_Equal
zeros-o . should_fail_with Matrix_Error.Dimensions_Not_Equal
Test.specify "should be able to multiply by a scalar" <|
ones*2 . should_equal twos
@ -293,7 +294,7 @@ spec =
identity*zeros . should_equal zeros
Test.specify "should fail to multiply by a matrix with mismatched dimensions" <|
o = Matrix.ones 2 3
zeros*o . should_fail_with Matrix.Dimensions_Not_Equal
zeros*o . should_fail_with Matrix_Error.Dimensions_Not_Equal
Test.specify "should be able to divide by a scalar" <|
zeros/2 . should_equal zeros
@ -310,7 +311,7 @@ spec =
twos/all_twos . should_equal ones
Test.specify "should fail to divide by a matrix with mismatched dimensions" <|
o = Matrix.ones 2 3
zeros/o . should_fail_with Matrix.Dimensions_Not_Equal
zeros/o . should_fail_with Matrix_Error.Dimensions_Not_Equal
Test.group "Matrix with 4 channels" <|
zeros = Matrix.zeros 3 3 channels=4
@ -340,8 +341,8 @@ 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.Index_Out_Of_Bounds_Error
identity.get -1 -1 . should_fail_with Matrix.Index_Out_Of_Bounds_Error
identity.get 10 10 . should_fail_with Matrix_Error.Index_Out_Of_Bounds_Error
identity.get -1 -1 . should_fail_with Matrix_Error.Index_Out_Of_Bounds_Error
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)
@ -359,7 +360,7 @@ spec =
ones+ones . should_equal twos
Test.specify "should fail to add a matrix with mismatched dimensions" <|
o = Matrix.ones 2 3
zeros+o . should_fail_with Matrix.Dimensions_Not_Equal
zeros+o . should_fail_with Matrix_Error.Dimensions_Not_Equal
Test.specify "should be able to subtract a scalar" <|
ones-1 . should_equal (Matrix.from_vector (ones.to_vector . map (_ - 1)) rows=3 channels=4)
@ -376,7 +377,7 @@ spec =
identity-zeros . should_equal identity
Test.specify "should fail to subtract a matrix with mismatched dimensions" <|
o = Matrix.ones 2 3
zeros-o . should_fail_with Matrix.Dimensions_Not_Equal
zeros-o . should_fail_with Matrix_Error.Dimensions_Not_Equal
Test.specify "should be able to multiply by a scalar" <|
ones*2 . should_equal twos
@ -394,7 +395,7 @@ spec =
identity*zeros . should_equal zeros
Test.specify "should fail to multiply by a matrix with mismatched dimensions" <|
o = Matrix.ones 2 3
zeros*o . should_fail_with Matrix.Dimensions_Not_Equal
zeros*o . should_fail_with Matrix_Error.Dimensions_Not_Equal
Test.specify "should be able to divide by a scalar" <|
zeros/2 . should_equal zeros
@ -411,4 +412,6 @@ spec =
twos/all_twos . should_equal ones
Test.specify "should fail to divide by a matrix with mismatched dimensions" <|
o = Matrix.ones 2 3
zeros/o . should_fail_with Matrix.Dimensions_Not_Equal
zeros/o . should_fail_with Matrix_Error.Dimensions_Not_Equal
main = Test_Suite.run_main spec

View File

@ -3,9 +3,9 @@ import Standard.Base.System.Platform
import Standard.Base.System.Process
import Standard.Base.System.Process.Exit_Code
import Standard.Image.Codecs
from Standard.Image import Image, Read_Flag, Write_Flag
import Standard.Test
from Standard.Test import Test, Test_Suite
polyglot java import java.lang.System as Java_System
@ -20,44 +20,46 @@ spec =
True ->
case fetch rgba_addr rgba_file of
Exit_Code.Exit_Failure _ ->
"The Codecs spec was not able to fetch the file from " + rgba_addr
"The Image.Read spec was not able to fetch the file from " + rgba_addr
Exit_Code.Exit_Success ->
Nothing
False ->
"The Codecs spec only run when the `CI` environment variable is set to true"
"The Image.Read spec only run when the `CI` environment variable is set to true"
Test.group "Codecs" pending=pending <|
Test.group "Image.read" pending=pending <|
Test.specify "should return error when read failed" <|
Codecs.read (enso_project.root / 'no_such_file.png') . should_fail_with File.IO_Error
Image.read (enso_project.root / 'no_such_file.png') . should_fail_with File.IO_Error
Test.specify "should read a color image" <|
img = Codecs.read rgba_file
img = Image.read rgba_file
img.rows.should_equal 160
img.columns.should_equal 320
img.channels.should_equal 3
Test.specify "should read an image as grayscale" <|
img = Codecs.read rgba_file Codecs.Read_Grayscale
img = Image.read rgba_file Read_Flag.Grayscale
img.rows.should_equal 160
img.columns.should_equal 320
img.channels.should_equal 1
Test.specify "should read an image with an alpha channel" <|
img = Codecs.read rgba_file Codecs.Read_Alpha_Channel
img = Image.read rgba_file Read_Flag.Alpha_Channel
img.rows.should_equal 160
img.columns.should_equal 320
img.channels.should_equal 4
Test.specify "should return error when write failed" <|
out_file = enso_project.root / "no_such_directory" / "out.png"
Codecs.read rgba_file . write out_file . should_fail_with File.IO_Error
Image.read rgba_file . write out_file . should_fail_with File.IO_Error
Test.specify "should write a PNG file with alpha channel" <|
out_file = enso_project.root / "out_alpha.png"
Codecs.read rgba_file Codecs.Read_Alpha_Channel . write out_file
Image.read rgba_file Read_Flag.Alpha_Channel . write out_file
Test.specify "should write a grayscale PNG file" <|
out_file = enso_project.root / "out_gray.png"
Codecs.read rgba_file Codecs.Read_Grayscale . write out_file
Image.read rgba_file Read_Flag.Grayscale . write out_file
Test.specify "should write a PNG file with compression" <|
out_file = enso_project.root / "out.png"
Codecs.read rgba_file . write out_file (Codecs.Write_Png_Compression 3) . should_equal Nothing
Image.read rgba_file . write out_file (Write_Flag.PNG_Compression 3) . should_equal Nothing
Test.specify "should write a JPEG file with compression" <|
out_file = enso_project.root / "out.jpeg"
flags = [Codecs.Write_Jpeg_Quality 75, Codecs.Write_Jpeg_Optimize, Codecs.Write_Jpeg_Progressive]
Codecs.read rgba_file . write out_file flags . should_equal Nothing
flags = [Write_Flag.JPEG_Quality 75, Write_Flag.JPEG_Optimize, Write_Flag.JPEG_Progressive]
Image.read rgba_file . write out_file flags . should_equal Nothing
main = Test_Suite.run_main spec

View File

@ -1,12 +1,12 @@
from Standard.Base import all
import Standard.Test
from Standard.Test import Test_Suite
import project.Codecs_Spec
import project.Image_Read_Spec
import project.Data.Image_Spec
import project.Data.Matrix_Spec
main = Test.Suite.run_main <|
Codecs_Spec.spec
main = Test_Suite.run_main <|
Image_Read_Spec.spec
Matrix_Spec.spec
Image_Spec.spec

View File

@ -6,7 +6,7 @@ from Standard.Table.Data.Aggregate_Column.Aggregate_Column import all
import Standard.Table.Internal.Aggregate_Column_Helper
import Standard.Table.Internal.Problem_Builder.Problem_Builder
import Standard.Test
from Standard.Test import Test, Test_Suite
spec = Test.group "Aggregate Columns" <|
simple_table = Table.new [["count", [1, 2, Nothing, 3, Nothing]], ["is_valid", [Nothing, False, True, False, Nothing]], ["float", [3.4, 1, 5.6, 2.1, Nothing]], ["text", ["A", "", Nothing, "B,C", Nothing]]]
@ -196,4 +196,4 @@ spec = Test.group "Aggregate Columns" <|
test_aggregator percentile_table (Percentile 0.66 0) "66%-ile tests" 70.78
test_aggregator empty_table (Mode 0 test_name) test_name Nothing
main = Test.Suite.run_main spec
main = Test_Suite.run_main spec

View File

@ -6,8 +6,7 @@ from Standard.Table.Data.Aggregate_Column.Aggregate_Column import all
from Standard.Table.Errors import Missing_Input_Columns_Data, Column_Indexes_Out_Of_Range_Data, No_Output_Columns, Duplicate_Output_Column_Names_Data, Invalid_Output_Column_Names_Data, Invalid_Aggregation_Data, Floating_Point_Grouping_Data, Unquoted_Delimiter_Data, Additional_Warnings_Data
from Standard.Database.Errors import Unsupported_Database_Operation_Error_Data
import Standard.Test
import Standard.Test.Problems
from Standard.Test import Test, Test_Suite, Problems
polyglot java import java.lang.Double
@ -1389,4 +1388,4 @@ aggregate_spec prefix table empty_table table_builder materialize is_database te
expect_sum_and_unsupported_errors 1 <|
table.aggregate [Sum "X", Count_Distinct (By_Name ["X", "Y"])]
main = Test.Suite.run_main spec
main = Test_Suite.run_main spec

View File

@ -4,7 +4,7 @@ import Standard.Table.Data.Column.Empty_Error
import Standard.Table.Data.Storage.Storage
import Standard.Examples
import Standard.Test
from Standard.Test import Test, Test_Suite
polyglot java import org.enso.table.data.column.storage.Storage as Java_Storage
@ -98,4 +98,4 @@ spec = Test.group "Columns" <|
sample.r_squared perfect_pred . should_equal 1
sample.r_squared bad_pred . should_equal -3
main = Test.Suite.run_main spec
main = Test_Suite.run_main spec

View File

@ -10,8 +10,7 @@ from Standard.Table.Errors import all
from Standard.Database.Errors import SQL_Error_Data
import Standard.Test
import Standard.Test.Problems
from Standard.Test import Test, Problems
from project.Util import all

View File

@ -2,7 +2,7 @@ from Standard.Base import all
from Standard.Table import Table, Column, Delimited, Column_Selector
import Standard.Test
from Standard.Test import Test, Test_Suite
from project.Util import all
@ -108,4 +108,4 @@ spec =
out.delete_if_exists
main = Test.Suite.run_main spec
main = Test_Suite.run_main spec

View File

@ -3,8 +3,7 @@ from Standard.Base import all
from Standard.Table import Table, Column, Data_Formatter, Quote_Style
from Standard.Table.Errors import all
import Standard.Test
import Standard.Test.Problems
from Standard.Test import Test, Test_Suite, Problems
type Custom_Type
Value field
@ -275,4 +274,4 @@ spec =
formatter_3.true_values . should_equal []
formatter_3.false_values . should_equal []
main = Test.Suite.run_main spec
main = Test_Suite.run_main spec

View File

@ -10,8 +10,7 @@ import Standard.Database.Data.SQL_Type.SQL_Type
from Standard.Database.Data.Table import combine_names, fresh_names
from Standard.Database.Errors import Unsupported_Database_Operation_Error_Data
import Standard.Test
import Standard.Test.Problems
from Standard.Test import Test, Test_Suite, Problems
import project.Database.Helpers.Fake_Test_Connection
@ -213,4 +212,4 @@ spec =
code = t1.aggregate [Sum "A" "sum_a", Group_By "C" Nothing, Group_By "B" "B grp"] . to_sql . prepare
code . should_equal ['SELECT SUM("T1"."A") AS "sum_a", "T1"."C" AS "C", "T1"."B" AS "B grp" FROM "T1" AS "T1" GROUP BY "T1"."C", "T1"."B"', []]
main = Test.Suite.run_main spec
main = Test_Suite.run_main spec

View File

@ -7,8 +7,7 @@ from Standard.Table.Errors import No_Input_Columns_Selected, Missing_Input_Colum
from Standard.Database import all
from Standard.Database.Errors import Unsupported_Database_Operation_Error_Data
import Standard.Test
import Standard.Test.Problems
from Standard.Test import Test, Problems
import project.Database.Helpers.Name_Generator

View File

@ -1,6 +1,6 @@
from Standard.Base import all
import Standard.Test
from Standard.Test import Test_Suite
import project.Database.Codegen_Spec
import project.Database.SQLite_Spec
@ -13,4 +13,4 @@ databases_spec =
Postgres_Spec.spec
Redshift_Spec.spec
main = Test.Suite.run_main databases_spec
main = Test_Suite.run_main databases_spec

View File

@ -13,7 +13,7 @@ import Standard.Database.Data.SQL_Type.SQL_Type
import Standard.Database.Internal.Postgres.Pgpass
import Standard.Test
from Standard.Test import Test, Test_Suite
import Standard.Test.Test_Environment
import project.Database.Common_Spec
@ -360,4 +360,4 @@ spec =
pgpass_spec
connection_setup_spec
main = Test.Suite.run_main spec
main = Test_Suite.run_main spec

View File

@ -5,7 +5,7 @@ from Standard.Table import Table
from Standard.Database import Database, Redshift, AWS_Credential, SQL_Query
import Standard.Test
from Standard.Test import Test, Test_Suite
import project.Database.Common_Spec
import project.Database.Helpers.Name_Generator
@ -122,4 +122,4 @@ spec =
connection = Database.connect connection_details
run_tests connection
main = Test.Suite.run_main spec
main = Test_Suite.run_main spec

View File

@ -6,7 +6,7 @@ from Standard.Table import Table
from Standard.Database import Database, SQLite, In_Memory, SQL_Query
from Standard.Database.Errors import SQL_Error_Data
import Standard.Test
from Standard.Test import Test, Test_Suite
import project.Database.Common_Spec
import project.Database.Helpers.Name_Generator
@ -137,4 +137,4 @@ spec =
sqlite_spec (Database.connect (SQLite In_Memory)) "[SQLite Memory] "
main = Test.Suite.run_main spec
main = Test_Suite.run_main spec

View File

@ -3,8 +3,7 @@ from Standard.Base import all
from Standard.Table import Table, Column, Data_Formatter, Quote_Style, Delimited
from Standard.Table.Errors import all
import Standard.Test
import Standard.Test.Problems
from Standard.Test import Test, Test_Suite, Problems
import project.Util
@ -393,4 +392,4 @@ spec =
Delimited ',' comment_character='#' . without_comments . should_equal (Delimited ',' comment_character=Nothing)
Delimited ',' . with_line_endings Line_Ending_Style.Unix . should_equal (Delimited ',' line_endings=Line_Ending_Style.Unix)
main = Test.Suite.run_main spec
main = Test_Suite.run_main spec

View File

@ -5,8 +5,7 @@ from Standard.Base.Error.Problem_Behavior import all
from Standard.Table import Table, Column, Data_Formatter, Quote_Style, Column_Name_Mapping, Match_Columns, Delimited
from Standard.Table.Errors import all
import Standard.Test
import Standard.Test.Problems
from Standard.Test import Test, Test_Suite, Problems
from project.Util import all
@ -539,4 +538,4 @@ spec =
result.catch.message . should_equal "The explicitly provided line endings ('\n') do not match the line endings in the file ('\r')."
file.delete
main = Test.Suite.run_main spec
main = Test_Suite.run_main spec

View File

@ -7,8 +7,7 @@ from Standard.Table import Table, Match_Columns, Column_Name_Mapping, Excel, Exc
from Standard.Table.Errors import Invalid_Output_Column_Names_Data, Duplicate_Output_Column_Names_Data, Invalid_Location_Data, Range_Exceeded_Data, Existing_Data_Data, Column_Count_Mismatch_Data, Column_Name_Mismatch_Data
import Standard.Test
import Standard.Test.Problems
from Standard.Test import Test, Test_Suite, Problems
import Standard.Examples
@ -630,4 +629,4 @@ spec =
spec_write "xlsx" 'TestSheet.xlsx'
spec_write "xls" 'TestSheetOld.xls'
main = Test.Suite.run_main spec
main = Test_Suite.run_main spec

View File

@ -2,8 +2,7 @@ from Standard.Base import all
from Standard.Base.System.File_Format import Unsupported_File_Type_Data
import Standard.Table.IO.File_Read
import Standard.Test
import Standard.Test.Problems
from Standard.Test import Test, Test_Suite, Problems
spec =
sample_xxx = enso_project.data / "sample.xxx"
@ -48,4 +47,4 @@ spec =
problems = [Encoding_Error_Data "Encoding issues at 14, 15, 16."]
Problems.test_problem_handling action problems tester
main = Test.Suite.run_main spec
main = Test_Suite.run_main spec

View File

@ -1,6 +1,6 @@
from Standard.Base import all
import Standard.Test
from Standard.Test import Test_Suite
import project.Column_Spec
import project.Csv_Spec
@ -25,4 +25,4 @@ in_memory_spec =
Aggregate_Column_Spec.spec
Aggregate_Spec.spec
main = Test.Suite.run_main in_memory_spec
main = Test_Suite.run_main in_memory_spec

View File

@ -1,7 +1,7 @@
from Standard.Base import all
from Standard.Table import Table
import Standard.Test
from Standard.Test import Test, Test_Suite
import project.Util
@ -20,4 +20,4 @@ spec = Test.group 'JSON conversion' <|
(Json.parse out.read_text).to_table ['a', 'b', 'c'] . should_equal simple_empty
out.delete_if_exists
main = Test.Suite.run_main spec
main = Test_Suite.run_main spec

View File

@ -1,13 +1,13 @@
from Standard.Base import all
import Standard.Test
from Standard.Test import Test_Suite
import project.In_Memory_Tests
import project.Database.Main as Database_Tests
import project.File_Read_Spec
import project.Data_Formatter_Spec
main = Test.Suite.run_main <|
main = Test_Suite.run_main <|
In_Memory_Tests.in_memory_spec
Database_Tests.databases_spec
File_Read_Spec.spec

View File

@ -7,8 +7,7 @@ from Standard.Table.Errors import Invalid_Format, Leading_Zeros, Missing_Input_C
import Standard.Visualization
import Standard.Test
import Standard.Test.Problems
from Standard.Test import Test, Test_Suite, Problems
spec = Test.group "Table.parse_values" <|
Test.specify "should correctly parse integers" <|
@ -284,4 +283,4 @@ spec = Test.group "Table.parse_values" <|
t2.at "floats" . to_vector . should_equal c2
t2.at "bools" . to_vector . should_equal c3
main = Test.Suite.run_main spec
main = Test_Suite.run_main spec

View File

@ -3,7 +3,7 @@ from Standard.Base import all
from Standard.Table import Table, Column, Delimited, Data_Formatter
import Standard.Table.Data.Storage.Storage
import Standard.Test
from Standard.Test import Test, Test_Suite
from project.Util import all
spec =
@ -49,4 +49,4 @@ spec =
delimited = Text.from test_table format=(Delimited "," value_formatter=data_formatter line_endings=Line_Ending_Style.Unix)
delimited.should_equal expected_text
main = Test.Suite.run_main spec
main = Test_Suite.run_main spec

View File

@ -6,13 +6,12 @@ from Standard.Table import Table, Column, Sort_Column, Column_Selector, Sort_Col
from Standard.Table.Data.Aggregate_Column.Aggregate_Column import all hiding First, Last
from Standard.Table.Data.Table import Empty_Error
from Standard.Table.Data.Storage import Storage
import Standard.Table.Data.Value_Type.Value_Type
from Standard.Table.Errors import Invalid_Output_Column_Names_Data, Duplicate_Output_Column_Names_Data, No_Input_Columns_Selected, Missing_Input_Columns_Data, No_Such_Column_Error_Data, Floating_Point_Grouping_Data, Invalid_Value_Type
import Standard.Visualization
import Standard.Test
import Standard.Test.Problems
import Standard.Table.Data.Value_Type.Value_Type
from Standard.Test import Test, Test_Suite, Problems
import project.Common_Table_Spec
from project.Util import all
@ -1028,7 +1027,7 @@ spec =
check_timing "dates" <|
t.filter date_col (Filter_Condition.Is_In dates_vec) . at "X" . to_vector . should_equal expected_vector
main = Test.Suite.run_main spec
main = Test_Suite.run_main spec
## JS indexes months form 0, so we need to subtract 1.
foreign js js_make_date year month day = """

View File

@ -3,7 +3,7 @@ from Standard.Base import all
from Standard.Table import Table, Delimited, Column, Data_Formatter
import Standard.Table.Data.Storage
import Standard.Test
from Standard.Test import Test, Test_Suite
from project.Util import all
@ -47,4 +47,4 @@ spec =
delimited = Text.from test_table format=(Delimited "," value_formatter=data_formatter line_endings=Line_Ending_Style.Unix)
delimited.should_equal expected_text
main = Test.Suite.run_main spec
main = Test_Suite.run_main spec

View File

@ -3,7 +3,7 @@ from Standard.Base import all
from Standard.Table import Table, Delimited, Column, Data_Formatter
import Standard.Table.Data.Storage
import Standard.Test
from Standard.Test import Test, Test_Suite
from project.Util import all
@ -46,4 +46,4 @@ spec =
delimited = Text.from test_table format=(Delimited "," value_formatter=data_formatter line_endings=Line_Ending_Style.Unix)
delimited.should_equal expected_text
main = Test.Suite.run_main spec
main = Test_Suite.run_main spec

View File

@ -2,7 +2,7 @@ from Standard.Base import all
import Standard.Table.Internal.Unique_Name_Strategy.Unique_Name_Strategy
import Standard.Test
from Standard.Test import Test, Test_Suite
spec = Test.group 'Unique_Name_Strategy Helper' <|
Test.specify 'should change an empty name to "Column"' <|
@ -40,4 +40,4 @@ spec = Test.group 'Unique_Name_Strategy Helper' <|
strategy.renames.length . should_equal 2
strategy.invalid_names.length . should_equal 0
main = Test.Suite.run_main spec
main = Test_Suite.run_main spec

View File

@ -3,7 +3,7 @@ import Standard.Base.System
from Standard.Table import Table, Column
import Standard.Test
from Standard.Test import Test
Table.should_equal self expected =
self_cols = self.columns

View File

@ -1,6 +1,6 @@
from Standard.Base import all
import Standard.Test
from Standard.Test import Test, Test_Suite
spec =
Test.group "JavaScript Objects, Arrays & Functions" <|
@ -61,7 +61,7 @@ spec =
(enso_vector.at 2).should_equal Nothing
enso_vector.should_equal js_arr
main = Test.Suite.run_main spec
main = Test_Suite.run_main spec
foreign js data = """
var object = { name : "java.lang.Object", superclass: null };

View File

@ -1,6 +1,6 @@
from Standard.Base import all
import Standard.Test
from Standard.Test import Test, Test_Suite
polyglot java import java.util.LinkedHashSet
@ -62,4 +62,4 @@ spec =
as_vec = json.into (Vector.fill 1 Number)
as_vec.should_equal <| Vector.fill 100 0
main = Test.Suite.run_main spec
main = Test_Suite.run_main spec

View File

@ -1,6 +1,6 @@
from Standard.Base import all
import Standard.Test
from Standard.Test import Test, Test_Suite
Boolean.method self = self
@ -41,4 +41,4 @@ spec =
(1 == 0) && "foo" . should_equal False
(1 == 1) && "foo" . should_equal "foo"
main = Test.Suite.run_main spec
main = Test_Suite.run_main spec

View File

@ -1,6 +1,6 @@
from Standard.Base import all
import Standard.Test
from Standard.Test import Test, Test_Suite
spec =
Test.group "identity" <|
@ -37,4 +37,4 @@ spec =
times = uncurry (*)
times [6, 7] . should_equal 42
main = Test.Suite.run_main spec
main = Test_Suite.run_main spec

View File

@ -1,6 +1,6 @@
from Standard.Base import all
import Standard.Test
from Standard.Test import Test, Test_Suite
spec =
Test.group "Bound" <|
@ -101,4 +101,4 @@ spec =
Interval.inclusive 0 0 . not_empty . should_be_true
Interval.inclusive 10 0 . not_empty . should_be_false
main = Test.Suite.run_main spec
main = Test_Suite.run_main spec

View File

@ -1,6 +1,7 @@
from Standard.Base import all
import Standard.Test
from Standard.Test import Test, Test_Suite
import Standard.Test.Test_Result.Test_Result
type Author
Value name year_of_birth
@ -10,24 +11,24 @@ type Book
Text.should_fail_parsing_with self expected =
as_fail = case Json.parse self of
_ -> Test.Failure "Expected a parse error, but no error reported."
_ -> Test_Result.Failure "Expected a parse error, but no error reported."
result = as_fail.catch Any e-> case e of
Json.Parse_Error_Data msg ->
if msg.contains expected then Test.Success else
if msg.contains expected then Test_Result.Success else
fail_msg = "The reported message " + msg.to_text + " did not contain " + expected.to_text + "."
Test.Failure fail_msg
Test_Result.Failure fail_msg
_ ->
fail_msg = "Expected a parser error, but " + e.to_text + " was thrown."
Test.Failure fail_msg
Test_Result.Failure fail_msg
case result of
Test.Success -> Test.Success
fail -> Panic.throw fail
Test_Result.Success -> Test_Result.Success
_ -> Panic.throw result
Text.should_parse_as self expected =
Test.Verbs.equal (Json.parse self) expected.to_json
Json.parse self . should_equal expected.to_json
Text.should_render_itself self =
Test.Verbs.equal (Json.parse self . to_text) self
Json.parse self . to_text . should_equal self
spec =
Test.group "JSON Deserialization" <|
@ -125,4 +126,4 @@ spec =
object.get "foo" . should_equal (Json.String "bar")
object.get "bar" . should_fail_with Json.No_Such_Field_Error_Data
main = Test.Suite.run_main spec
main = Test_Suite.run_main spec

View File

@ -1,7 +1,7 @@
from Standard.Base import all
from Standard.Base.Data.List import Empty_Error
import Standard.Test
from Standard.Test import Test, Test_Suite
spec = Test.group "List" <|
l = Cons 1 <| Cons 2 <| Cons 3 <| Nil
@ -122,4 +122,4 @@ spec = Test.group "List" <|
l.rest . should_equal (Cons 2 (Cons 3 Nil))
empty.rest.should_fail_with Empty_Error
main = Test.Suite.run_main spec
main = Test_Suite.run_main spec

View File

@ -2,7 +2,7 @@ from Standard.Base import all
polyglot java import java.util.Locale as JavaLocale
import Standard.Test
from Standard.Test import Test, Test_Suite
with_locale locale ~test =
default_locale = JavaLocale.getDefault
@ -74,4 +74,4 @@ spec = Test.group "Locale" <|
Locale.uk . should_equal Locale.uk
Locale.uk . should_not_equal Locale.us
main = Test.Suite.run_main spec
main = Test_Suite.run_main spec

View File

@ -2,7 +2,7 @@ from Standard.Base import all
from Standard.Base.Data.Map import No_Value_For_Key_Error_Data
import Standard.Test
from Standard.Test import Test, Test_Suite
spec = Test.group "Maps" <|
m = Map.empty . insert 1 2 . insert 2 4
@ -108,4 +108,4 @@ spec = Test.group "Maps" <|
m = Map.empty
m.last . should_equal Nothing
main = Test.Suite.run_main spec
main = Test_Suite.run_main spec

View File

@ -1,6 +1,6 @@
from Standard.Base import all
import Standard.Test
from Standard.Test import Test, Test_Suite
spec = Test.group "Maybe" <|
Test.specify "should have a None variant" <|
@ -17,3 +17,4 @@ spec = Test.group "Maybe" <|
Maybe.None.is_none . should_be_true
Maybe.Some 2 . is_none . should_be_false
main = Test_Suite.run_main spec

View File

@ -3,7 +3,7 @@ from Standard.Base import all
import Standard.Base.Data.Noise.Generator
import Standard.Base.Error.Common
import Standard.Test
from Standard.Test import Test, Test_Suite
spec =
Test.group "Generator Interface" <|
@ -22,4 +22,4 @@ spec =
values = 1.up_to 10000 . to_vector . map (gen.step _ interval)
values.all (v -> (v >= -100) && (v <= 100)) . should_be_true
main = Test.Suite.run_main spec
main = Test_Suite.run_main spec

View File

@ -1,6 +1,6 @@
from Standard.Base import all
import Standard.Test
from Standard.Test import Test, Test_Suite
type My_Generator
My_Generator.step self _ _ = 1
@ -17,3 +17,4 @@ spec = Test.group "Noise" <|
values = 1.up_to 10001 . to_vector . map (_.noise interval)
values.all (v -> (v >= -250) && (v <= 250)) . should_be_true
main = Test_Suite.run_main spec

View File

@ -2,7 +2,7 @@ from Standard.Base import all
from Standard.Base.Data.Numbers import Parse_Error_Data
import Standard.Test
from Standard.Test import Test, Test_Suite
Integer.is_even self = self % 2 == 0
@ -320,4 +320,4 @@ spec =
Number.nan . equals Number.nan . should_be_false
Number.nan . equals 0 . should_be_false
main = Test.Suite.run_main spec
main = Test_Suite.run_main spec

View File

@ -4,15 +4,15 @@ import Standard.Base.Data.Ordering.Comparator
polyglot java import java.lang.ClassCastException
import Standard.Test
from Standard.Test import Test, Test_Suite
# === Test Resources ===
type Ord
Value number
Ord.compare_to : Ord -> Ordering
Ord.compare_to self that = that.number.compare_to self.number
compare_to : Ord -> Ordering
compare_to self that = that.number.compare_to self.number
type No_Ord
Value number
@ -61,4 +61,4 @@ spec = Test.group "Object Comparator" <|
(default_comparator 1 True).should_fail_with Incomparable_Values_Error
(default_comparator (No_Ord.Value 1) (No_Ord.Value 2)).should_fail_with Incomparable_Values_Error
main = Test.Suite.run_main spec
main = Test_Suite.run_main spec

View File

@ -1,6 +1,6 @@
from Standard.Base import all
import Standard.Test
from Standard.Test import Test, Test_Suite
spec = Test.group "Natural Order" <|
case_insensitive_compare a b = Natural_Order.compare a b Case_Sensitivity.Insensitive
@ -58,4 +58,4 @@ spec = Test.group "Natural Order" <|
["1.0002", "1.0001", "1.01", "1.1", "1.10", "1.2", "2", "0", "1.20"].sort by=Natural_Order.compare . should_equal ["0", "1.0001", "1.01", "1.1", "1.0002", "1.2", "1.10", "1.20", "2"]
main = Test.Suite.run_main spec
main = Test_Suite.run_main spec

View File

@ -2,7 +2,7 @@ from Standard.Base import all
import Standard.Base.Data.Ordering.Vector_Lexicographic_Order
import Standard.Test
from Standard.Test import Test, Test_Suite
type My_Type
Value a b
@ -19,4 +19,4 @@ spec = Test.group "Lexicographic Order on Vectors" <|
Vector_Lexicographic_Order.compare [My_Type.Value "a" 1, My_Type.Value "b" 1, My_Type.Value "c" 1] [My_Type.Value "b" 1, My_Type.Value "a" 1, My_Type.Value "c" 1] element_comparator=comparator . should_equal Ordering.Less
Vector_Lexicographic_Order.compare [My_Type.Value "a" 1, My_Type.Value "b" 1, My_Type.Value "c" 1] [My_Type.Value "a" 100, My_Type.Value "b" 2, My_Type.Value "c" 3] element_comparator=comparator . should_equal Ordering.Equal
main = Test.Suite.run_main spec
main = Test_Suite.run_main spec

View File

@ -1,17 +1,16 @@
from Standard.Base import all
import Standard.Test
from Standard.Test import Test, Test_Suite
# === Test Resources ===
type Ord
Value number
Ord.compare_to : Ord -> Ordering
Ord.compare_to self that = if self.number == that.number then Ordering.Equal else
compare_to : Ord -> Ordering
compare_to self that = if self.number == that.number then Ordering.Equal else
if self.number > that.number then Ordering.Greater else Ordering.Less
# === The Tests ===
spec =
@ -42,4 +41,4 @@ spec =
Ordering.from_sign 0 . should_equal Ordering.Equal
Ordering.from_sign 1 . should_equal Ordering.Greater
main = Test.Suite.run_main spec
main = Test_Suite.run_main spec

View File

@ -2,7 +2,7 @@ from Standard.Base import all
import Standard.Base.Runtime.Ref
import Standard.Test
from Standard.Test import Test, Test_Suite
spec = Test.group "Range" <|
Test.specify "should be created with a start, an end and a step" <|
@ -380,4 +380,4 @@ spec = Test.group "Range" <|
invalid_range . find _->True . should_fail_with Illegal_State_Error_Data
invalid_range . contains 0 . should_fail_with Illegal_State_Error_Data
main = Test.Suite.run_main spec
main = Test_Suite.run_main spec

View File

@ -2,7 +2,7 @@ from Standard.Base import all
import Standard.Base.Runtime.Ref
import Standard.Test
from Standard.Test import Test, Test_Suite
spec = Test.group "Refs" <|
Test.specify "should be able to store and retrieve value in references" <|
@ -11,4 +11,4 @@ spec = Test.group "Refs" <|
v = r.get
v.should_equal 'bar'
main = Test.Suite.run_main spec
main = Test_Suite.run_main spec

View File

@ -1,6 +1,6 @@
from Standard.Base import Nothing, Vector, Number, Decimal, True, Illegal_Argument_Error_Data, False, Regression
import Standard.Test
from Standard.Test import Test, Test_Suite
spec =
## Regression test data produced using an Excel spreadsheet.
@ -105,4 +105,4 @@ spec =
expected_ys = [0.222594, 0.302868, 0.3046, 0.309085]
vector_compare (test_xs.map fitted.predict) expected_ys
main = Test.Suite.run_main spec
main = Test_Suite.run_main spec

Some files were not shown because too many files have changed in this diff Show More