Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
66 changes: 26 additions & 40 deletions electronics/electric_conductivity.py
Original file line number Diff line number Diff line change
@@ -1,53 +1,39 @@
from __future__ import annotations


from typing import List

ELECTRON_CHARGE = 1.6021e-19 # units = C


if __name__ == "__main__":
import doctest

doctest.testmod()


def electric_conductivity(
conductivity: float,
electron_conc: float,
mobility: float,
) -> tuple[str, float]:
"""
This function can calculate any one of the three -
1. Conductivity
2. Electron Concentration
3. Electron Mobility
This is calculated from the other two provided values
Examples -
>>> electric_conductivity(conductivity=25, electron_conc=100, mobility=0)
('mobility', 1.5604519068722301e+18)
>>> electric_conductivity(conductivity=0, electron_conc=1600, mobility=200)
('conductivity', 5.12672e-14)
>>> electric_conductivity(conductivity=1000, electron_conc=0, mobility=1200)
('electron_conc', 5.201506356240767e+18)
"""
if (conductivity, electron_conc, mobility).count(0) != 1:
raise ValueError("You cannot supply more or less than 2 values")
elif conductivity < 0:
raise ValueError("Conductivity cannot be negative")
elif electron_conc < 0:
raise ValueError("Electron concentration cannot be negative")
elif mobility < 0:
raise ValueError("mobility cannot be negative")
elif conductivity == 0:
return (
"conductivity",
mobility * electron_conc * ELECTRON_CHARGE,
)
elif electron_conc == 0:
return (
"electron_conc",
conductivity / (mobility * ELECTRON_CHARGE),
)
else:
return (
"mobility",
conductivity / (electron_conc * ELECTRON_CHARGE),
)
"""Same description as given above."""
parameters = [conductivity, electron_conc, mobility]
labels = ["conductivity", "electron_conc", "mobility"]

validate_inputs(parameters)

if __name__ == "__main__":
import doctest
if conductivity == 0:
return (labels[0], mobility * electron_conc * ELECTRON_CHARGE)
elif electron_conc == 0:
return (labels[1], conductivity / (mobility * ELECTRON_CHARGE))
else:
return (labels[2], conductivity / (electron_conc * ELECTRON_CHARGE))

doctest.testmod()
def validate_inputs(values: list[float]) -> None:
"""Check if inputs are valid."""
if values.count(0) != 1:
raise ValueError("You cannot supply more or less than 2 values")
neg_val = [v < 0 for v in values]
if any(neg_val):
raise ValueError(f"{values[neg_val.index(True)]} cannot be negative")
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
import pytest
from electronics.electric_conductivity import *


# Test case to validate correct exception is raised when no parameters is zero
def test_electric_conductivity_value_error_no_zero_parameters():
conductivity = 5
electron_conc = 5
mobility = 5
with pytest.raises(ValueError, match=r".*cannot supply more or less than 2 values"):
electric_conductivity(conductivity, electron_conc, mobility)


# Test case to validate correct exception is raised when more than one parameter is zero
def test_electric_conductivity_value_error_more_than_one_zero_parameters():
conductivity = 0
electron_conc = 0
mobility = 5
with pytest.raises(ValueError, match=r".*cannot supply more or less than 2 values"):
electric_conductivity(conductivity, electron_conc, mobility)


# Test case to validate the function doesn't throw any errors when expecting to return conductivity
def test_electric_conductivity_is_calculating_conductivity():
conductivity = 0
electron_conc = 26
mobility = 1.2
result = electric_conductivity(conductivity, electron_conc, mobility)
assert result is not None
assert isinstance(result, tuple)
assert result[0] == "conductivity"


# Test case to validate the function doesn't throw any errors when expecting to return electron concentration
def test_electric_conductivity_is_calculating_electron_concentration():
conductivity = 2.5
electron_conc = 0
mobility = 1.3
result = electric_conductivity(conductivity, electron_conc, mobility)
assert result is not None
assert isinstance(result, tuple)
assert result[0] == "electron_conc"


# Test case to validate the function doesn't throw any errors when expecting to return electron mobility
def test_electric_conductivity_is_calculating_mobility():
conductivity = 3.5
electron_conc = 2.6
mobility = 0
result = electric_conductivity(conductivity, electron_conc, mobility)
assert result is not None
assert isinstance(result, tuple)
assert result[0] == "mobility"