         XCTAssertEqual(space.entities[0].id, 1)
         XCTAssertEqual(space.entities[0].type, 2)
         XCTAssertEqual(space.entities[0].component(ofType: SerializableComponent.self)?.field, 20)
+    }
+
+    func testCanSerializeSpace() {
+        let space = Space()
+
+        XCTAssertTrue(GameSerializer.canSerialize(space))
+    }
+
+    func testCanSerializeSpaceChecksComponents() {
+        let space = Space()
+        space.addEntity(Entity(components: [SerializableComponent(field: 1)]))
+
+        XCTAssertTrue(GameSerializer.canSerialize(space))
+    }
+
+    func testCanSerializeSpaceFailsOnNonSerializableComponent() {
+        let space = Space()
+        space.addEntity(Entity(components: [UnserializableComponent()]))
+
+        XCTAssertFalse(GameSerializer.canSerialize(space))
+    }
+
+    func testCanSerializeSpaceFailsOnNonSerializableSubspace() {
+        let space = Space()
+        space.addSubspace(UnserializableSubspace())
+
+        XCTAssertFalse(GameSerializer.canSerialize(space))
     }
     
     // MARK: Presets

        } catch {
            XCTAssert(error is SerializationError)
        }
    }
    
    // MARK: Space

    struct UnserializableComponent: Component {
        
    }

    final class UnserializableSubspace: Subspace {

    }
    
    class Provider: BasicSerializationTypeProvider {
        var serializableTypes: [Serializable.Type] = [
