### Question:
AnimatableModel extends FeatureModel implements Animatable, Recyclable { @Override public void play(Animation animation) { animator.play(animation); } AnimatableModel(Services services, Setup setup);  AnimatableModel(Services services, Setup setup, Animator animator); @Override void addListener(AnimatorListener listener); @Override void removeListener(AnimatorListener listener); @Override void update(double extrp); @Override void play(Animation animation); @Override void stop(); @Override void reset(); @Override void setAnimSpeed(double speed); @Override void setFrame(int frame); @Override int getFrames(); @Override int getFrame(); @Override int getFrameAnim(); @Override AnimState getAnimState(); @Override boolean is(AnimState state); @Override void recycle();  }### Answer:
@Test void testPlay() { final int first = 2; final int last = 4; final Animation animation = new Animation(Animation.DEFAULT_NAME, first, last, 1.0, false, false); final Animatable animatable = new AnimatableModel(services, setup); testAnimatorState(animatable, Animation.MINIMUM_FRAME, Animation.MINIMUM_FRAME, AnimState.STOPPED); assertEquals(1, animatable.getFrames()); animatable.play(animation); testAnimatorState(animatable, first, first, AnimState.PLAYING); assertFalse(animatable.is(AnimState.FINISHED)); assertEquals(last - first + 1, animatable.getFrames()); animatable.update(1.0); testAnimatorState(animatable, first, first + 1, AnimState.PLAYING); animatable.update(1.0); testAnimatorState(animatable, first, last, AnimState.PLAYING); animatable.update(1.0); testAnimatorState(animatable, first, last, AnimState.FINISHED); animatable.stop(); testAnimatorState(animatable, first, last, AnimState.STOPPED); }