diff --git a/examples/assets/faithful.csv b/examples/assets/faithful.csv deleted file mode 100644 index a11030a..0000000 --- a/examples/assets/faithful.csv +++ /dev/null @@ -1,273 +0,0 @@ -"Index", "Eruption length (mins)","Eruption wait (mins)" - 1, 3.600, 79 - 2, 1.800, 54 - 3, 3.333, 74 - 4, 2.283, 62 - 5, 4.533, 85 - 6, 2.883, 55 - 7, 4.700, 88 - 8, 3.600, 85 - 9, 1.950, 51 - 10, 4.350, 85 - 11, 1.833, 54 - 12, 3.917, 84 - 13, 4.200, 78 - 14, 1.750, 47 - 15, 4.700, 83 - 16, 2.167, 52 - 17, 1.750, 62 - 18, 4.800, 84 - 19, 1.600, 52 - 20, 4.250, 79 - 21, 1.800, 51 - 22, 1.750, 47 - 23, 3.450, 78 - 24, 3.067, 69 - 25, 4.533, 74 - 26, 3.600, 83 - 27, 1.967, 55 - 28, 4.083, 76 - 29, 3.850, 78 - 30, 4.433, 79 - 31, 4.300, 73 - 32, 4.467, 77 - 33, 3.367, 66 - 34, 4.033, 80 - 35, 3.833, 74 - 36, 2.017, 52 - 37, 1.867, 48 - 38, 4.833, 80 - 39, 1.833, 59 - 40, 4.783, 90 - 41, 4.350, 80 - 42, 1.883, 58 - 43, 4.567, 84 - 44, 1.750, 58 - 45, 4.533, 73 - 46, 3.317, 83 - 47, 3.833, 64 - 48, 2.100, 53 - 49, 4.633, 82 - 50, 2.000, 59 - 51, 4.800, 75 - 52, 4.716, 90 - 53, 1.833, 54 - 54, 4.833, 80 - 55, 1.733, 54 - 56, 4.883, 83 - 57, 3.717, 71 - 58, 1.667, 64 - 59, 4.567, 77 - 60, 4.317, 81 - 61, 2.233, 59 - 62, 4.500, 84 - 63, 1.750, 48 - 64, 4.800, 82 - 65, 1.817, 60 - 66, 4.400, 92 - 67, 4.167, 78 - 68, 4.700, 78 - 69, 2.067, 65 - 70, 4.700, 73 - 71, 4.033, 82 - 72, 1.967, 56 - 73, 4.500, 79 - 74, 4.000, 71 - 75, 1.983, 62 - 76, 5.067, 76 - 77, 2.017, 60 - 78, 4.567, 78 - 79, 3.883, 76 - 80, 3.600, 83 - 81, 4.133, 75 - 82, 4.333, 82 - 83, 4.100, 70 - 84, 2.633, 65 - 85, 4.067, 73 - 86, 4.933, 88 - 87, 3.950, 76 - 88, 4.517, 80 - 89, 2.167, 48 - 90, 4.000, 86 - 91, 2.200, 60 - 92, 4.333, 90 - 93, 1.867, 50 - 94, 4.817, 78 - 95, 1.833, 63 - 96, 4.300, 72 - 97, 4.667, 84 - 98, 3.750, 75 - 99, 1.867, 51 -100, 4.900, 82 -101, 2.483, 62 -102, 4.367, 88 -103, 2.100, 49 -104, 4.500, 83 -105, 4.050, 81 -106, 1.867, 47 -107, 4.700, 84 -108, 1.783, 52 -109, 4.850, 86 -110, 3.683, 81 -111, 4.733, 75 -112, 2.300, 59 -113, 4.900, 89 -114, 4.417, 79 -115, 1.700, 59 -116, 4.633, 81 -117, 2.317, 50 -118, 4.600, 85 -119, 1.817, 59 -120, 4.417, 87 -121, 2.617, 53 -122, 4.067, 69 -123, 4.250, 77 -124, 1.967, 56 -125, 4.600, 88 -126, 3.767, 81 -127, 1.917, 45 -128, 4.500, 82 -129, 2.267, 55 -130, 4.650, 90 -131, 1.867, 45 -132, 4.167, 83 -133, 2.800, 56 -134, 4.333, 89 -135, 1.833, 46 -136, 4.383, 82 -137, 1.883, 51 -138, 4.933, 86 -139, 2.033, 53 -140, 3.733, 79 -141, 4.233, 81 -142, 2.233, 60 -143, 4.533, 82 -144, 4.817, 77 -145, 4.333, 76 -146, 1.983, 59 -147, 4.633, 80 -148, 2.017, 49 -149, 5.100, 96 -150, 1.800, 53 -151, 5.033, 77 -152, 4.000, 77 -153, 2.400, 65 -154, 4.600, 81 -155, 3.567, 71 -156, 4.000, 70 -157, 4.500, 81 -158, 4.083, 93 -159, 1.800, 53 -160, 3.967, 89 -161, 2.200, 45 -162, 4.150, 86 -163, 2.000, 58 -164, 3.833, 78 -165, 3.500, 66 -166, 4.583, 76 -167, 2.367, 63 -168, 5.000, 88 -169, 1.933, 52 -170, 4.617, 93 -171, 1.917, 49 -172, 2.083, 57 -173, 4.583, 77 -174, 3.333, 68 -175, 4.167, 81 -176, 4.333, 81 -177, 4.500, 73 -178, 2.417, 50 -179, 4.000, 85 -180, 4.167, 74 -181, 1.883, 55 -182, 4.583, 77 -183, 4.250, 83 -184, 3.767, 83 -185, 2.033, 51 -186, 4.433, 78 -187, 4.083, 84 -188, 1.833, 46 -189, 4.417, 83 -190, 2.183, 55 -191, 4.800, 81 -192, 1.833, 57 -193, 4.800, 76 -194, 4.100, 84 -195, 3.966, 77 -196, 4.233, 81 -197, 3.500, 87 -198, 4.366, 77 -199, 2.250, 51 -200, 4.667, 78 -201, 2.100, 60 -202, 4.350, 82 -203, 4.133, 91 -204, 1.867, 53 -205, 4.600, 78 -206, 1.783, 46 -207, 4.367, 77 -208, 3.850, 84 -209, 1.933, 49 -210, 4.500, 83 -211, 2.383, 71 -212, 4.700, 80 -213, 1.867, 49 -214, 3.833, 75 -215, 3.417, 64 -216, 4.233, 76 -217, 2.400, 53 -218, 4.800, 94 -219, 2.000, 55 -220, 4.150, 76 -221, 1.867, 50 -222, 4.267, 82 -223, 1.750, 54 -224, 4.483, 75 -225, 4.000, 78 -226, 4.117, 79 -227, 4.083, 78 -228, 4.267, 78 -229, 3.917, 70 -230, 4.550, 79 -231, 4.083, 70 -232, 2.417, 54 -233, 4.183, 86 -234, 2.217, 50 -235, 4.450, 90 -236, 1.883, 54 -237, 1.850, 54 -238, 4.283, 77 -239, 3.950, 79 -240, 2.333, 64 -241, 4.150, 75 -242, 2.350, 47 -243, 4.933, 86 -244, 2.900, 63 -245, 4.583, 85 -246, 3.833, 82 -247, 2.083, 57 -248, 4.367, 82 -249, 2.133, 67 -250, 4.350, 74 -251, 2.200, 54 -252, 4.450, 83 -253, 3.567, 73 -254, 4.500, 73 -255, 4.150, 88 -256, 3.817, 80 -257, 3.917, 71 -258, 4.450, 83 -259, 2.000, 56 -260, 4.283, 79 -261, 4.767, 78 -262, 4.533, 84 -263, 1.850, 58 -264, 4.250, 83 -265, 1.983, 43 -266, 2.250, 60 -267, 4.750, 75 -268, 4.117, 81 -269, 2.150, 46 -270, 4.417, 90 -271, 1.817, 46 -272, 4.467, 74 diff --git a/examples/clue_solver.ds b/examples/clue_solver.ds deleted file mode 100644 index 657a7eb..0000000 --- a/examples/clue_solver.ds +++ /dev/null @@ -1,15 +0,0 @@ -suspects = ("White", "Green"); -rooms = ("Library", "Kitchen"); -weapons = ("Rope", "Lead Pipe"); - -make_guess = { - current_room = input.0; - - if length(suspects) == 1 - && length(rooms) == 1 - && length(weapons) == 1 - then - output 'It was ' + suspects.0 + ' in the ' + rooms.0 + ' with the ' + weapons.0 '!'; - else - output 'I accuse ' + random(suspects) + ' in the ' + current_room + ' with the ' + random(weapons) '!'; -}; diff --git a/examples/collections.ds b/examples/collections.ds deleted file mode 100644 index 4099e71..0000000 --- a/examples/collections.ds +++ /dev/null @@ -1,114 +0,0 @@ -# transform - -list = (1, 2, 3); -test = transform(list, 'input + 1'); -assert_equal((2, 3, 4), test); - -# string - -test = string(42); -assert_equal("42", test); - -test = string(42.42); -assert_equal("42.42", test); - -test = string(false); -assert_equal("false", test); - -# create_table - -table = create_table( - ("text", "num"), - ( - ("foo", 1), - ("bar", 2) - ) -); - -# rows - -test = rows(table); -assert_equal( - ( - ("foo", 1), - ("bar", 2) - ), - test -); - -# insert - -test = insert( - table, - ( - ("foo", 1), - ("bar", 2) - ) -); -assert_equal( - create_table( - ("text", "num"), - ( - ("foo", 1), - ("bar", 2), - ("foo", 1), - ("bar", 2) - ) - ), - test -); - -# select - -table = create_table( - ("text", "number", "bool"), - ( - ("a", 1, true), - ("b", 2, true), - ("a", 3, true) - ) -); - -test_table = create_table( - ("text", "bool"), - ( - ("a", true), - ("b", true), - ("a", true) - ) -); - -assert_equal(select(table, ("text", "bool")), test_table); - -test_table = create_table( - ("text", "number", "bool"), - ( - ("a", 1, true), - ("a", 3, true) - ) -); - -assert_equal(where(table, 'text == "a"'), test_table); - -# count - -table = create_table( - ("text", "number", "bool"), - ( - ("a", 1, true), - ("b", 2, true), - ("a", 3, true) - ) -); -test = count(table); -assert_equal(3, test); - -test = count("123"); -assert_equal(3, test); - -test = count(1, 2, 3); -assert_equal(3, test); - -map.x.z.y = 1; -test = count(map); -assert_equal(1, test); diff --git a/examples/data_formats.ds b/examples/data_formats.ds deleted file mode 100644 index 6264143..0000000 --- a/examples/data_formats.ds +++ /dev/null @@ -1,4 +0,0 @@ -dob = from_toml("1979-05-27T07:32:00-08:00"); -toml = to_toml(dob); - -assert_equal(toml, "1979-05-27T07:32:00-08:00"); diff --git a/examples/fetch.ds b/examples/fetch.ds deleted file mode 100644 index 7a11fab..0000000 --- a/examples/fetch.ds +++ /dev/null @@ -1,4 +0,0 @@ -raw_data = download("https://api.sampleapis.com/futurama/cast"); -data = from_json(raw_data); - -assert_equal("Billy West", data.0.name); diff --git a/examples/gui_rendering.ds b/examples/gui_rendering.ds deleted file mode 100644 index 8d7ce33..0000000 --- a/examples/gui_rendering.ds +++ /dev/null @@ -1,6 +0,0 @@ -# This will read a CSV file and display it as a line plot in a GUI window. -read_file("examples/assets/faithful.csv") - -> from_csv(input) - -> rows(input) - -> transform(input, 'input.1') - -> plot(input); diff --git a/examples/list.ds b/examples/list.ds deleted file mode 100644 index a252616..0000000 --- a/examples/list.ds +++ /dev/null @@ -1,12 +0,0 @@ -# Lists are created by grouping items in partheses and separating them with -# commas. - -numbers = (1, 2, 3); - -# To access the values in a list, use an integer as an index. - -x = numbers.0; -y = numbers.1; -z = numbers.2; - -assert_equal(x + y, z); diff --git a/examples/scope.ds b/examples/scope.ds deleted file mode 100644 index 0bf0a5b..0000000 --- a/examples/scope.ds +++ /dev/null @@ -1,9 +0,0 @@ -foo = "bar"; -func = 'foo'; - -assert_equal("bar", func()); - -foo = "xyz"; - -assert_equal("xyz", func()); - diff --git a/examples/table.ds b/examples/table.ds deleted file mode 100644 index 65b75cc..0000000 --- a/examples/table.ds +++ /dev/null @@ -1,29 +0,0 @@ -table = create_table( - ("text", "number", "bool"), - ( - ("a", 1, true), - ("b", 2, true), - ("a", 3, true) - ) -); - -test_table = create_table( - ("text", "bool"), - ( - ("a", true), - ("b", true), - ("a", true) - ) -); - -assert_equal(select(table, ("text", "bool")), test_table); - -test_table = create_table( - ("text", "number", "bool"), - ( - ("a", 1, true), - ("a", 3, true) - ) -); - -assert_equal(where(table, 'text == "a"'), test_table); diff --git a/examples/variables.ds b/examples/variables.ds deleted file mode 100644 index 79e306c..0000000 --- a/examples/variables.ds +++ /dev/null @@ -1,13 +0,0 @@ -# Dust is data-oriented, so variables are declared with minimal syntax. A -# single character, the assignment operator (`=`), sets a variable. - -x = 1; -y = "hello dust!"; -z = 42.0; -list = (3, 2, x); -big_list = (x, y, z, list); -map.x = "foobar"; -function = ' - message = "I am a function!"; - output message; -'; \ No newline at end of file diff --git a/src/interface.rs b/src/interface.rs index 060eb7c..1c7d09e 100644 --- a/src/interface.rs +++ b/src/interface.rs @@ -1,6 +1,5 @@ //! The top level of Dust's API with functions to interpret Dust code. -use egui::util::id_type_map; use tree_sitter::{Node, Parser, Tree, TreeCursor}; use crate::{language, Error, Result, Value, VariableMap}; @@ -351,6 +350,8 @@ impl ControlFlow { #[cfg(test)] mod tests { + use crate::{Function, Table}; + use super::*; #[test] @@ -378,6 +379,82 @@ mod tests { eval("'`one`'"), vec![Ok(Value::String("`one`".to_string()))] ); + assert_eq!( + eval("\"'one'\""), + vec![Ok(Value::String("'one'".to_string()))] + ); + } + + #[test] + fn evaluate_list() { + assert_eq!( + eval("(1, 2, 'foobar')"), + vec![Ok(Value::List(vec![ + Value::Integer(1), + Value::Integer(2), + Value::String("foobar".to_string()), + ]))] + ); + } + + #[test] + fn evaluate_function() { + let function_str = "function { + output message; + output 'The answer is ' + answer; + }"; + + assert_eq!( + eval("{ x = 1, foo = 'bar' }"), + vec![Ok(Value::Function(Function::new(function_str)))] + ); + } + + #[test] + fn evaluate_map() { + let mut map = VariableMap::new(); + + map.set_value("x", Value::Integer(1)).unwrap(); + map.set_value("foo", Value::String("bar".to_string())) + .unwrap(); + + assert_eq!(eval("{ x = 1, foo = 'bar' }"), vec![Ok(Value::Map(map))]); + } + + #[test] + fn evaluate_table() { + let mut table = Table::new(vec!["messages".to_string(), "numbers".to_string()]); + + table + .insert(vec![Value::String("hiya".to_string()), Value::Integer(42)]) + .unwrap(); + table + .insert(vec![Value::String("foo".to_string()), Value::Integer(-57)]) + .unwrap(); + table + .insert(vec![Value::String("bar".to_string()), Value::Float(99.99)]) + .unwrap(); + + assert_eq!( + eval( + "table + row ('hiya', 42) + row ('foo', -57) + row ('bar', 99.99)" + ), + vec![Ok(Value::Table(table.clone()))] + ); + assert_eq!( + eval( + "my_table = table + row ('hiya', 42); + + my_table += ('foo', -57); + my_table += ('bar', 99.99); + my_table" + ), + vec![Ok(Value::Table(table))] + ); } #[test] diff --git a/src/value/mod.rs b/src/value/mod.rs index 5cb163f..9d249b3 100644 --- a/src/value/mod.rs +++ b/src/value/mod.rs @@ -66,6 +66,8 @@ impl Value { "string" => { let without_quotes = &value_snippet[1..value_snippet.len() - 1]; + println!("{without_quotes}"); + Ok(Value::String(without_quotes.to_string())) } "boolean" => { diff --git a/tests/dust_examples.rs b/tests/dust_examples.rs deleted file mode 100644 index b9cb51a..0000000 --- a/tests/dust_examples.rs +++ /dev/null @@ -1,45 +0,0 @@ -use std::fs::read_to_string; - -use dust_lib::*; - -#[test] -fn collections() { - let file_contents = read_to_string("examples/collections.ds").unwrap(); - - eval(&file_contents).unwrap(); -} - -#[test] -fn list() { - let file_contents = read_to_string("examples/list.ds").unwrap(); - - eval(&file_contents).unwrap(); -} - -#[test] -fn table() { - let file_contents = read_to_string("examples/table.ds").unwrap(); - - eval(&file_contents).unwrap(); -} - -#[test] -fn variables() { - let file_contents = read_to_string("examples/variables.ds").unwrap(); - - eval(&file_contents).unwrap(); -} - -#[test] -fn scope() { - let file_contents = read_to_string("examples/scope.ds").unwrap(); - - eval(&file_contents).unwrap(); -} - -#[test] -fn data_formats() { - let file_contents = read_to_string("examples/data_formats.ds").unwrap(); - - eval(&file_contents).unwrap(); -}