Skip to content

Commit

Permalink
Rewrite helpers as fixtures in tests (#1612)
Browse files Browse the repository at this point in the history
* Rewrite helpers as fixtures in tests.

* Update isort configuration
  • Loading branch information
mondeja authored Jun 2, 2021
1 parent 0751d07 commit 8908226
Show file tree
Hide file tree
Showing 20 changed files with 331 additions and 341 deletions.
4 changes: 2 additions & 2 deletions setup.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -47,8 +47,8 @@ use_parentheses = True
combine_as_imports = True
include_trailing_comma = True
py_version = 36
known_tests = tests
sections = STDLIB,THIRDPARTY,FIRSTPARTY,TESTS,LOCALFOLDER
known_tests_third_party = pytest
sections = STDLIB,THIRDPARTY,TESTS_THIRD_PARTY,FIRSTPARTY,LOCALFOLDER

[coverage:report]
exclude_lines =
Expand Down
50 changes: 46 additions & 4 deletions tests/test_helper.py → tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,11 @@

import numpy as np

import pytest

from moviepy.video.io.VideoFileClip import VideoFileClip


PYTHON_VERSION = "%s.%s" % (sys.version_info.major, sys.version_info.minor)
TMP_DIR = tempfile.gettempdir() # because tempfile.tempdir is sometimes None

# Arbitrary font used in caption testing.
Expand All @@ -33,8 +34,10 @@


@functools.lru_cache(maxsize=None)
def get_test_video():
return VideoFileClip("media/big_buck_bunny_432_433.webm").subclip(0, 1)
def get_video(start_time=0, end_time=1):
return VideoFileClip("media/big_buck_bunny_432_433.webm").subclip(
start_time, end_time
)


@functools.lru_cache(maxsize=None)
Expand All @@ -56,7 +59,7 @@ def make_mono_frame(t):


@contextlib.contextmanager
def static_files_server(port=8000):
def get_static_files_server(port=8000):
my_server = socketserver.TCPServer(("", port), http.server.SimpleHTTPRequestHandler)
thread = threading.Thread(target=my_server.serve_forever, daemon=True)
thread.start()
Expand Down Expand Up @@ -139,3 +142,42 @@ def generic_visit(self, node):
visitor = FunctionsWithDefinedDecoratorExtractor()
visitor.visit(modtree)
return visitor.functions_with_decorator


@pytest.fixture
def util():
class MoviepyTestUtils:
FONT = FONT
TMP_DIR = TMP_DIR

return MoviepyTestUtils


@pytest.fixture
def video():
return get_video


@pytest.fixture
def stereo_wave():
return get_stereo_wave


@pytest.fixture
def mono_wave():
return get_mono_wave


@pytest.fixture
def static_files_server():
return get_static_files_server


@pytest.fixture
def moviepy_modules():
return get_moviepy_modules


@pytest.fixture
def functions_with_decorator_defined():
return get_functions_with_decorator_defined
61 changes: 29 additions & 32 deletions tests/test_AudioClips.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import os

import numpy as np

import pytest

from moviepy.audio.AudioClip import (
Expand All @@ -12,59 +13,57 @@
concatenate_audioclips,
)
from moviepy.audio.io.AudioFileClip import AudioFileClip
from moviepy.utils import close_all_clips

from tests.test_helper import TMP_DIR, get_mono_wave, get_stereo_wave


def test_audioclip():
audio = AudioClip(get_mono_wave(440), duration=2, fps=22050)
audio.write_audiofile(os.path.join(TMP_DIR, "audioclip.mp3"), bitrate="16")
def test_audioclip(util, mono_wave):
filename = os.path.join(util.TMP_DIR, "audioclip.mp3")
audio = AudioClip(mono_wave(440), duration=2, fps=22050)
audio.write_audiofile(filename, bitrate="16", logger=None)

assert os.path.exists(os.path.join(TMP_DIR, "audioclip.mp3"))
assert os.path.exists(filename)

clip = AudioFileClip(os.path.join(TMP_DIR, "audioclip.mp3"))
AudioFileClip(filename)

# TODO Write better tests; find out why the following fail
# assert clip.duration == 2
# assert clip.fps == 22050
# assert clip.reader.bitrate == 16
close_all_clips(locals())


def test_audioclip_io():
def test_audioclip_io(util):
filename = os.path.join(util.TMP_DIR, "random.wav")

# Generate a random audio clip of 4.989 seconds at 44100 Hz,
# and save it to a file.
input_array = np.random.random((220000, 2)) * 1.98 - 0.99
clip = AudioArrayClip(input_array, fps=44100)
clip.write_audiofile(os.path.join(TMP_DIR, "random.wav"))
clip.write_audiofile(filename, logger=None)
# Load the clip.
# The loaded clip will be slightly longer because the duration is rounded
# up to 4.99 seconds.
# Verify that the extra frames are all zero, and the remainder is identical
# to the original signal.
clip = AudioFileClip(os.path.join(TMP_DIR, "random.wav"))
clip = AudioFileClip(filename)
output_array = clip.to_soundarray()
np.testing.assert_array_almost_equal(
output_array[: len(input_array)], input_array, decimal=4
)
assert (output_array[len(input_array) :] == 0).all()

close_all_clips(locals())


def test_concatenate_audioclips_render():
def test_concatenate_audioclips_render(util, mono_wave):
"""Concatenated AudioClips through ``concatenate_audioclips`` should return
a clip that can be rendered to a file.
"""
clip_440 = AudioClip(get_mono_wave(440), duration=0.01, fps=44100)
clip_880 = AudioClip(get_mono_wave(880), duration=0.000001, fps=22050)
filename = os.path.join(util.TMP_DIR, "concatenate_audioclips.mp3")

clip_440 = AudioClip(mono_wave(440), duration=0.01, fps=44100)
clip_880 = AudioClip(mono_wave(880), duration=0.000001, fps=22050)

concat_clip = concatenate_audioclips((clip_440, clip_880))
concat_clip.write_audiofile(os.path.join(TMP_DIR, "concatenate_audioclips.mp3"))
concat_clip.write_audiofile(filename, logger=None)

assert concat_clip.duration == clip_440.duration + clip_880.duration
close_all_clips(locals())


def test_concatenate_audioclips_CompositeAudioClip():
Expand Down Expand Up @@ -107,8 +106,6 @@ def test_concatenate_audioclips_CompositeAudioClip():
# channels are maximum number of channels of the clips
assert concat_clip.nchannels == max(clip.nchannels for clip in clips)

close_all_clips(locals())


def test_CompositeAudioClip_by__init__():
"""The difference between the CompositeAudioClip returned by
Expand Down Expand Up @@ -146,41 +143,41 @@ def test_CompositeAudioClip_by__init__():
# channels are maximum number of channels of the clips
assert compound_clip.nchannels == max(clip.nchannels for clip in clips)

close_all_clips(locals())


def test_concatenate_audioclip_with_audiofileclip():
def test_concatenate_audioclip_with_audiofileclip(util, stereo_wave):
clip1 = AudioClip(
get_stereo_wave(left_freq=440, right_freq=880),
stereo_wave(left_freq=440, right_freq=880),
duration=1,
fps=44100,
)
clip2 = AudioFileClip("media/crunching.mp3")

concat_clip = concatenate_audioclips((clip1, clip2))
concat_clip.write_audiofile(
os.path.join(TMP_DIR, "concat_clip_with_file_audio.mp3")
os.path.join(util.TMP_DIR, "concat_clip_with_file_audio.mp3"),
logger=None,
)

assert concat_clip.duration == clip1.duration + clip2.duration


def test_concatenate_audiofileclips():
def test_concatenate_audiofileclips(util):
clip1 = AudioFileClip("media/crunching.mp3").subclip(1, 4)

# Checks it works with videos as well
clip2 = AudioFileClip("media/big_buck_bunny_432_433.webm")
concat_clip = concatenate_audioclips((clip1, clip2))

concat_clip.write_audiofile(os.path.join(TMP_DIR, "concat_audio_file.mp3"))
concat_clip.write_audiofile(
os.path.join(util.TMP_DIR, "concat_audio_file.mp3"),
logger=None,
)

assert concat_clip.duration == clip1.duration + clip2.duration

close_all_clips(locals())


def test_audioclip_mono_max_volume():
clip = AudioClip(get_mono_wave(440), duration=1, fps=44100)
def test_audioclip_mono_max_volume(mono_wave):
clip = AudioClip(mono_wave(440), duration=1, fps=44100)
max_volume = clip.max_volume()
assert isinstance(max_volume, float)
assert max_volume > 0
Expand Down
1 change: 1 addition & 0 deletions tests/test_BitmapClip.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
"""BitmapClip tests."""

import numpy as np

import pytest

from moviepy.video.VideoClip import BitmapClip
Expand Down
1 change: 1 addition & 0 deletions tests/test_Clip.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import copy

import numpy as np

import pytest

from moviepy.Clip import Clip
Expand Down
8 changes: 4 additions & 4 deletions tests/test_ImageSequenceClip.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,8 @@

from moviepy.video.io.ImageSequenceClip import ImageSequenceClip

from tests.test_helper import TMP_DIR


def test_1():
def test_1(util):
images = []
durations = []

Expand All @@ -21,7 +19,9 @@ def test_1():

with ImageSequenceClip(images, durations=durations) as clip:
assert clip.duration == sum(durations)
clip.write_videofile(os.path.join(TMP_DIR, "ImageSequenceClip1.mp4"), fps=30)
clip.write_videofile(
os.path.join(util.TMP_DIR, "ImageSequenceClip1.mp4"), fps=30, logger=None
)


def test_2():
Expand Down
38 changes: 17 additions & 21 deletions tests/test_PR.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,48 +6,44 @@
import pytest

from moviepy.audio.io.AudioFileClip import AudioFileClip
from moviepy.utils import close_all_clips
from moviepy.video.compositing.CompositeVideoClip import CompositeVideoClip
from moviepy.video.fx.scroll import scroll
from moviepy.video.io.VideoFileClip import VideoFileClip
from moviepy.video.tools.interpolators import Trajectory
from moviepy.video.tools.subtitles import SubtitlesClip
from moviepy.video.VideoClip import ColorClip, ImageClip, TextClip

from tests.test_helper import FONT, TMP_DIR, get_test_video


def test_PR_306():
assert TextClip.list("font") != []
assert TextClip.list("color") != []

with pytest.raises(Exception):
TextClip.list("blah")
close_all_clips(locals())


def test_PR_339():
def test_PR_339(util):
# In caption mode.
TextClip(
text="foo",
color="white",
font=FONT,
font=util.FONT,
size=(640, 480),
method="caption",
align="center",
font_size=25,
).close()

# In label mode.
TextClip(text="foo", font=FONT, method="label").close()
TextClip(text="foo", font=util.FONT, method="label").close()


def test_PR_373():
def test_PR_373(util):
result = Trajectory.load_list("media/traj.txt")

Trajectory.save_list(result, os.path.join(TMP_DIR, "traj1.txt"))
Trajectory.save_list(result, os.path.join(util.TMP_DIR, "traj1.txt"))

result1 = Trajectory.load_list(os.path.join(TMP_DIR, "traj1.txt"))
result1 = Trajectory.load_list(os.path.join(util.TMP_DIR, "traj1.txt"))

assert len(result[0].tt) == len(result1[0].tt)
for i in range(len(result[0].tt)):
Expand All @@ -62,9 +58,9 @@ def test_PR_373():
assert result[0].yy[i] == result1[0].yy[i]


def test_PR_458():
def test_PR_458(util):
clip = ColorClip([1000, 600], color=(60, 60, 60), duration=2)
clip.write_videofile(os.path.join(TMP_DIR, "test.mp4"), logger=None, fps=30)
clip.write_videofile(os.path.join(util.TMP_DIR, "test.mp4"), logger=None, fps=30)
clip.close()


Expand All @@ -76,12 +72,12 @@ def test_PR_515():
assert clip.fps == 10.51


def test_PR_528():
def test_PR_528(util):
with ImageClip("media/vacation_2017.jpg") as clip:
new_clip = scroll(clip, w=1000, x_speed=50)
new_clip = new_clip.with_duration(0.2)
new_clip.fps = 24
new_clip.write_videofile(os.path.join(TMP_DIR, "pano.mp4"))
new_clip.write_videofile(os.path.join(util.TMP_DIR, "pano.mp4"), logger=None)


def test_PR_529():
Expand All @@ -99,17 +95,17 @@ def test_PR_610():
assert composite.fps == 25


def test_PR_1137_video():
def test_PR_1137_video(util, video):
"""Test support for path-like objects as arguments for VideoFileClip."""
with get_test_video().subclip(0.2, 0.4) as video:
video.write_videofile(Path(TMP_DIR) / "pathlike.mp4")
with video(start_time=0.2, end_time=0.24) as video:
video.write_videofile(Path(util.TMP_DIR) / "pathlike.mp4", logger=None)
assert isinstance(video.filename, str)


def test_PR_1137_audio():
def test_PR_1137_audio(util):
"""Test support for path-like objects as arguments for AudioFileClip."""
with AudioFileClip(Path("media/crunching.mp3")) as audio:
audio.write_audiofile(Path(TMP_DIR) / "pathlike.mp3")
audio.write_audiofile(Path(util.TMP_DIR) / "pathlike.mp3")
assert isinstance(audio.filename, str)


Expand All @@ -118,13 +114,13 @@ def test_PR_1137_image():
ImageClip(Path("media/vacation_2017.jpg")).close()


def test_PR_1137_subtitles():
def test_PR_1137_subtitles(util):
"""Test support for path-like objects as arguments for SubtitlesClip."""

def make_textclip(txt):
return TextClip(
txt,
font=FONT,
font=util.FONT,
font_size=24,
color="white",
stroke_color="black",
Expand Down
Loading

0 comments on commit 8908226

Please sign in to comment.