diff --git a/tests/ExpressionLanguageTest.php b/tests/ExpressionLanguageTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..4b31dfa74e06ac919f768c78e0dd3bcd4c7c48d4
--- /dev/null
+++ b/tests/ExpressionLanguageTest.php
@@ -0,0 +1,79 @@
+<?php
+
+declare(strict_types=1);
+
+namespace Dbp\Relay\CoreBundle\Tests;
+
+use Dbp\Relay\CoreBundle\ExpressionLanguage\ExpressionLanguage;
+use PHPUnit\Framework\TestCase;
+
+class ExpressionLanguageTest extends TestCase
+{
+    public function testBasics()
+    {
+        $lang = new ExpressionLanguage();
+        $this->assertTrue($lang->evaluate('true'));
+        $this->assertFalse($lang->evaluate('false'));
+    }
+
+    public function testFilter()
+    {
+        $lang = new ExpressionLanguage();
+        $this->assertSame([], $lang->evaluate('filter([], "true")'));
+        $this->assertSame([], $lang->evaluate('filter([1, 5, 2, 4], "false")'));
+        $this->assertSame([1, 5, 2, 4], $lang->evaluate('filter([1, 5, 2, 4], "true")'));
+        $this->assertSame([1, 5, 2, 4], $lang->evaluate('filter([1, 5, 2, 4], "42")'));
+        $this->assertSame([5, 4], $lang->evaluate('filter([1, 5, 2, 4], "value > 2")'));
+        $this->assertSame([2, 4], $lang->evaluate('filter({1: 2, 3: 4}, "true")'));
+    }
+
+    public function testMap()
+    {
+        $lang = new ExpressionLanguage();
+        $this->assertSame([], $lang->evaluate('map([], "true")'));
+        $this->assertSame([false], $lang->evaluate('map([1], "false")'));
+        $this->assertSame([2, 6, 3, 5], $lang->evaluate('map([1, 5, 2, 4], "value + 1")'));
+        $this->assertSame([1 => 3, 3 => 7], $lang->evaluate('map({1: 2, 3: 4}, "key + value")'));
+        $this->assertSame([1 => 42, 3 => 42], $lang->evaluate('map({1: 2, 3: 4}, "42")'));
+    }
+
+    public function testEmpty()
+    {
+        $lang = new ExpressionLanguage();
+        $this->assertTrue($lang->evaluate('empty([])'));
+        $this->assertTrue($lang->evaluate('empty(0)'));
+        $this->assertTrue($lang->evaluate('empty("0")'));
+        $this->assertFalse($lang->evaluate('empty(42)'));
+        $this->assertFalse($lang->evaluate('empty([42])'));
+    }
+
+    public function testPhp()
+    {
+        $lang = new ExpressionLanguage();
+        $this->assertSame(2, $lang->evaluate('count([1, 2])'));
+        $this->assertSame('1-2', $lang->evaluate('implode("-", ["1", "2"])'));
+        $this->assertSame(['1', '2'], $lang->evaluate('explode("-", "1-2")'));
+    }
+
+    public function testNumeric()
+    {
+        $lang = new ExpressionLanguage();
+        $this->assertSame(2.0, $lang->evaluate('ceil(1.2)'));
+        $this->assertSame(1.0, $lang->evaluate('floor(1.9)'));
+        $this->assertSame(1.0, $lang->evaluate('round(0.5)'));
+        $this->assertSame(42, $lang->evaluate('max([2, 42])'));
+        $this->assertSame(2, $lang->evaluate('min([2, 42])'));
+    }
+
+    public function testString()
+    {
+        $lang = new ExpressionLanguage();
+        $this->assertTrue($lang->evaluate('str_starts_with("foo", "fo")'));
+        $this->assertFalse($lang->evaluate('str_starts_with("foo", "xo")'));
+        $this->assertTrue($lang->evaluate('str_ends_with("foo", "oo")'));
+        $this->assertFalse($lang->evaluate('str_ends_with("foo", "of")'));
+        $this->assertSame('foo', $lang->evaluate('substr("foobar", 0, 3)'));
+        $this->assertSame(1, $lang->evaluate('strpos("foobar", "oo")'));
+        $this->assertSame(6, $lang->evaluate('strlen("foobar")'));
+    }
+}