diff --git a/src/pf_tests/test_mo_optimization_types.pf b/src/pf_tests/test_mo_optimization_types.pf
new file mode 100644
index 0000000000000000000000000000000000000000..d4d76df6be09d442de4c06c7153093b4fe5a4c07
--- /dev/null
+++ b/src/pf_tests/test_mo_optimization_types.pf
@@ -0,0 +1,48 @@
+module test_mo_optimization_types
+
+  use funit
+  use mo_optimization_types
+  use mo_kind, only : i4, dp
+
+  implicit none
+
+  private
+
+  public :: test_sim_data
+
+contains
+
+  @test
+  subroutine test_sim_data()
+
+    type(sim_data_t), target :: sim_data
+    integer(i4), dimension(2) :: shape_2d
+    integer(i4), dimension(3) :: shape_3d
+    real(dp), dimension(:,:), allocatable :: data_2d
+    real(dp), dimension(:,:), pointer :: ptr_2d
+    real(dp), dimension(:,:,:), pointer :: ptr_3d
+
+    logical :: r1, r2, r3, r4, r5, r6
+
+    shape_2d = [5, 6]
+    allocate(data_2d(5, 6), source=1.0)
+    call sim_data % add("dat1", ndim=2)
+    call sim_data % allocate("data1", shape_2d)
+    call sim_data % set_data("dat1", data_2d)
+    call sim_data % set_pointer("dat1", ptr_2d)
+    r1 = sim_data % has("dat1")
+    r2 = sim_data % has("dat2")
+    r3 = all(ptr_2d == data_2d)
+    @assertTrue(r1)
+    @assertFalse(r2)
+    @assertTrue(r3)
+
+    shape_3d = [2, 3, 4]
+    call sim_data % add("dat2", ndim=3, data_shape=shape_3d)
+    call sim_data % set_pointer("dat2", ptr_3d)
+    r4 = all(shape(ptr_3d) == shape_3d)
+    @assertTrue(r4)
+
+  end subroutine test_sim_data
+
+end module test_mo_optimization_types