diff --git a/boa/src/builtins/infinity/mod.rs b/boa/src/builtins/infinity/mod.rs new file mode 100644 index 0000000000..55e0347cf7 --- /dev/null +++ b/boa/src/builtins/infinity/mod.rs @@ -0,0 +1,32 @@ +//! This module implements the global `Infinity` property. +//! +//! The global property `Infinity` is a numeric value representing infinity. +//! +//! More information: +//! - [MDN documentation][mdn] +//! - [ECMAScript reference][spec] +//! +//! [spec]: https://tc39.es/ecma262/#sec-value-properties-of-the-global-object-infinity +//! [mdn]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Infinity + +#[cfg(test)] +mod tests; + +use crate::{builtins::value::Value, BoaProfiler}; + +/// JavaScript global `Infinity` property. +#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] +pub(crate) struct Infinity; + +impl Infinity { + /// The binding name of the property. + pub(crate) const NAME: &'static str = "Infinity"; + + /// Initialize the `Infinity` property on the global object. + #[inline] + pub(crate) fn init(_: &Value) -> (&str, Value) { + let _timer = BoaProfiler::global().start_event(Self::NAME, "init"); + + (Self::NAME, Value::from(f64::INFINITY)) + } +} diff --git a/boa/src/builtins/infinity/tests.rs b/boa/src/builtins/infinity/tests.rs new file mode 100644 index 0000000000..f63cbde1f8 --- /dev/null +++ b/boa/src/builtins/infinity/tests.rs @@ -0,0 +1,19 @@ +use crate::exec; + +#[test] +fn infinity_exists_on_global_object_and_evaluates_to_infinity_value() { + let scenario = r#" + Infinity; + "#; + + assert_eq!(&exec(scenario), "Infinity"); +} + +#[test] +fn infinity_exists_and_equals_to_number_positive_infinity_value() { + let scenario = r#" + Number.POSITIVE_INFINITY === Infinity; + "#; + + assert_eq!(&exec(scenario), "true"); +} diff --git a/boa/src/builtins/mod.rs b/boa/src/builtins/mod.rs index e0810a4374..fce6fb594c 100644 --- a/boa/src/builtins/mod.rs +++ b/boa/src/builtins/mod.rs @@ -7,6 +7,7 @@ pub mod console; pub mod error; pub mod function; pub mod global_this; +pub mod infinity; pub mod json; pub mod math; pub mod nan; @@ -24,6 +25,7 @@ pub(crate) use self::{ boolean::Boolean, error::{Error, RangeError, TypeError}, global_this::GlobalThis, + infinity::Infinity, json::Json, math::Math, nan::NaN, @@ -57,6 +59,7 @@ pub fn init(global: &Value) { TypeError::init(global), // Global properties. NaN::init(global), + Infinity::init(global), GlobalThis::init(global), ];