         } catch {
             XCTAssert(error is SerializationError)
         }
+    }
+
+    func testCanSerializeEntity() {
+        let entity = Entity()
+
+        XCTAssertTrue(GameSerializer.canSerialize(entity))
+    }
+
+    func testCanSerializeEntityChecksComponents() {
+        let entity = Entity(components: [SerializableComponent(field: 1)])
+
+        XCTAssertTrue(GameSerializer.canSerialize(entity))
+    }
+
+    func testCanSerializeEntityFailsOnNonSerializableComponent() {
+        let entity = Entity(components: [UnserializableComponent()])
+
+        XCTAssertFalse(GameSerializer.canSerialize(entity))
     }
     
     // MARK: Space

        XCTAssertEqual(space.entities[0].id, 1)
        XCTAssertEqual(space.entities[0].type, 2)
        XCTAssertEqual(space.entities[0].component(ofType: SerializableComponent.self)?.field, 20)
    }
    
    // MARK: Presets

    struct UnserializableComponent: Component {
        
    }

    final class UnserializableSubspace: Subspace {

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