Skip to content

Commit

Permalink
feat: Adds lesson_04 content (#125)
Browse files Browse the repository at this point in the history
* chore: sets up new project for lesson 04

Signed-off-by: Anthony D. Mays <[email protected]>

* chore: adds project files

Signed-off-by: Anthony D. Mays <[email protected]>

* feat: adds main conole logic

Signed-off-by: Anthony D. Mays <[email protected]>

* chore: actually adds main files

Signed-off-by: Anthony D. Mays <[email protected]>

* chore: removes outdated app settings

Signed-off-by: Anthony D. Mays <[email protected]>

* chore: sets up tests code

Signed-off-by: Anthony D. Mays <[email protected]>

* chore: linting

Signed-off-by: Anthony D. Mays <[email protected]>

* chore: completes framework and tests

Signed-off-by: Anthony D. Mays <[email protected]>

* feat: provides implementation for pow

Signed-off-by: Anthony D. Mays <[email protected]>

* chore: touches readme

Signed-off-by: Anthony D. Mays <[email protected]>

* chore: undoing file as an example

Signed-off-by: Anthony D. Mays <[email protected]>

* chore: restoring file for example

Signed-off-by: Anthony D. Mays <[email protected]>

* chore: format

Signed-off-by: Anthony D. Mays <[email protected]>

* feat: adds lesson_04 readme

Signed-off-by: Anthony D. Mays <[email protected]>

---------

Signed-off-by: Anthony D. Mays <[email protected]>
  • Loading branch information
anthonydmays committed Mar 6, 2024
1 parent ae9da2f commit e52620a
Show file tree
Hide file tree
Showing 19 changed files with 736 additions and 1 deletion.
27 changes: 27 additions & 0 deletions lesson_04/README.md
@@ -0,0 +1,27 @@
# Lesson 04

## Homework

1. Read CC 12.
1. Read article entitled [3 Questions That Will Make You A Phenomenal Rubber Duck][article-link]
1. Complete the [Expression Calculator](#expression-calculator) exercise

## Expression Calculator

For this assignment, you will need to implement the functions and logic required to calculate a mathematical expression. After implementing the `add`, `divide`, and `multiply` functions, you will combine these functions to compute the final result.

1. Update the code in the [ExpressionCalculator.java][calculator-file] file.
2. To check your work, you can run the application using the first command below and run the tests using the second one.
```bash
./gradlew run --console=plain
./gradlew test
```
3. As usual, make sure that you format your code and run the check command before creating your pull request.
```bash
./gradlew spotlessApply
./gradlew check
```
4. You must only submit changes to the `ExpressionCalculator.java` file to receive full credit.

[article-link]: https://blog.danslimmon.com/2024/01/18/3-questions-that-will-make-you-a-phenomenal-rubber-duck/
[calculator-file]: ./expression/expression_app/src/main/java/com/codedifferently/lesson4/ExpressionCalculator.java
9 changes: 9 additions & 0 deletions lesson_04/expression/.gitattributes
@@ -0,0 +1,9 @@
#
# https://help.github.com/articles/dealing-with-line-endings/
#
# Linux start script should use lf
/gradlew text eol=lf

# These are Windows script files and should use crlf
*.bat text eol=crlf

5 changes: 5 additions & 0 deletions lesson_04/expression/.gitignore
@@ -0,0 +1,5 @@
# Ignore Gradle project-specific cache directory
.gradle

# Ignore Gradle build output directory
build
28 changes: 28 additions & 0 deletions lesson_04/expression/.project
@@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>lesson_04</name>
<comment>Project quiz created by Buildship.</comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.buildship.core.gradleprojectbuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.buildship.core.gradleprojectnature</nature>
</natures>
<filteredResources>
<filter>
<id>1708474157606</id>
<name></name>
<type>30</type>
<matcher>
<id>org.eclipse.core.resources.regexFilterMatcher</id>
<arguments>node_modules|\.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__</arguments>
</matcher>
</filter>
</filteredResources>
</projectDescription>
13 changes: 13 additions & 0 deletions lesson_04/expression/.settings/org.eclipse.buildship.core.prefs
@@ -0,0 +1,13 @@
arguments=--init-script /Users/anthonymays/.local/share/nvim/mason/packages/jdtls/config_mac/org.eclipse.osgi/54/0/.cp/gradle/init/init.gradle
auto.sync=false
build.scans.enabled=false
connection.gradle.distribution=GRADLE_DISTRIBUTION(WRAPPER)
connection.project.dir=
eclipse.preferences.version=1
gradle.user.home=
java.home=/Library/Java/JavaVirtualMachines/temurin-17.jdk/Contents/Home
jvm.arguments=
offline.mode=false
override.workspace.settings=true
show.console.view=true
show.executions.view=true
24 changes: 24 additions & 0 deletions lesson_04/expression/expression_app/.classpath
@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" output="bin/main" path="src/main/java">
<attributes>
<attribute name="gradle_scope" value="main"/>
<attribute name="gradle_used_by_scope" value="main,test"/>
</attributes>
</classpathentry>
<classpathentry kind="src" output="bin/test" path="src/test/java">
<attributes>
<attribute name="gradle_scope" value="test"/>
<attribute name="gradle_used_by_scope" value="test"/>
<attribute name="test" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-17/"/>
<classpathentry kind="con" path="org.eclipse.buildship.core.gradleclasspathcontainer"/>
<classpathentry kind="src" path="/instructional-lib">
<attributes>
<attribute name="without_test_code" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="output" path="bin/default"/>
</classpath>
34 changes: 34 additions & 0 deletions lesson_04/expression/expression_app/.project
@@ -0,0 +1,34 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>expression_app</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.buildship.core.gradleprojectbuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jdt.core.javanature</nature>
<nature>org.eclipse.buildship.core.gradleprojectnature</nature>
</natures>
<filteredResources>
<filter>
<id>1</id>
<name></name>
<type>30</type>
<matcher>
<id>org.eclipse.core.resources.regexFilterMatcher</id>
<arguments>node_modules|\.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__</arguments>
</matcher>
</filter>
</filteredResources>
</projectDescription>
@@ -0,0 +1,2 @@
connection.project.dir=..
eclipse.preferences.version=1
@@ -0,0 +1,22 @@
eclipse.preferences.version=1
org.eclipse.jdt.core.classpath.outputOverlappingAnotherSource=ignore
org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull
org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.eclipse.jdt.core.compiler.codegen.targetPlatform=17
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
org.eclipse.jdt.core.compiler.compliance=17
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
org.eclipse.jdt.core.compiler.debug.localVariable=generate
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error
org.eclipse.jdt.core.compiler.problem.nullReference=warning
org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled
org.eclipse.jdt.core.compiler.source=17
66 changes: 66 additions & 0 deletions lesson_04/expression/expression_app/build.gradle.kts
@@ -0,0 +1,66 @@
plugins {
// Apply the application plugin to add support for building a CLI application in Java.
application
eclipse
id("com.diffplug.spotless") version "6.25.0"
id("org.springframework.boot") version "3.2.2"
}

apply(plugin = "io.spring.dependency-management")

repositories {
// Use Maven Central for resolving dependencies.
mavenCentral()
}

dependencies {
// Use JUnit Jupiter for testing.
testImplementation("com.codedifferently.instructional:instructional-lib")
testImplementation("org.junit.jupiter:junit-jupiter:5.9.1")
testImplementation("org.springframework.boot:spring-boot-starter-test")
testImplementation("org.assertj:assertj-core:3.25.1")
testImplementation("at.favre.lib:bcrypt:0.10.2")

// This dependency is used by the application.
implementation("com.codedifferently.instructional:instructional-lib")
implementation("com.google.guava:guava:31.1-jre")
implementation("org.projectlombok:lombok:1.18.30")
implementation("org.springframework.boot:spring-boot-starter")
}

application {
// Define the main class for the application.
mainClass.set("com.codedifferently.lesson4.Lesson4")
}

tasks.named<JavaExec>("run") {
standardInput = System.`in`
}

tasks.named<Test>("test") {
// Use JUnit Platform for unit tests.
useJUnitPlatform()
}


configure<com.diffplug.gradle.spotless.SpotlessExtension> {

format("misc", {
// define the files to apply `misc` to
target("*.gradle", ".gitattributes", ".gitignore")

// define the steps to apply to those files
trimTrailingWhitespace()
indentWithTabs() // or spaces. Takes an integer argument if you don't like 4
endWithNewline()
})

java {
// don't need to set target, it is inferred from java

// apply a specific flavor of google-java-format
googleJavaFormat()
// fix formatting of type annotations
formatAnnotations()
}
}
@@ -0,0 +1,19 @@
package com.codedifferently.lesson4;

public class ExpressionCalculator {
/**
* Returns the calculation of ((a + b) * c) / d^e
*
* @param a
* @param b
* @return
*/
public double calculate(double a, double b, double c, double d, double e) {
// Implement your code here to return the correct value.
return 0d;
}

public double pow(double base, double exponent) {
return Math.pow(base, exponent);
}
}
@@ -0,0 +1,49 @@
package com.codedifferently.lesson4;

import java.util.Scanner;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Configuration;

@Configuration
@SpringBootApplication(scanBasePackages = "com.codedifferently")
public class Lesson4 implements CommandLineRunner {

public static void main(String[] args) {
// To test, use `./gradlew run --console=plain`
var application = new SpringApplication(Lesson4.class);
application.run(args);
}

public void run(String... args) {
// Use Scanner to get input from the user.
var scanner = new Scanner(System.in);

System.out.print("\nEnter a value for variable 'a': ");
int a = scanner.nextInt();

System.out.print("Enter a value for variable 'b': ");
int b = scanner.nextInt();

System.out.print("Enter a value for variable 'c': ");
int c = scanner.nextInt();

System.out.print("Enter a value for variable 'd': ");
int d = scanner.nextInt();

System.out.print("Enter a value for variable 'e': ");
int e = scanner.nextInt();

// Close the scanner to avoid memory leaks.
scanner.close();

System.out.println(
String.format("\nNow computing the value of ((%s + %s) * %s) / %s^%s", a, b, c, d, e));

var calculator = new ExpressionCalculator();
double result = calculator.calculate(a, b, c, d, e);

System.out.println(String.format("The result is: %s", result));
}
}
@@ -0,0 +1,82 @@
package com.codedifferently.lesson4;

import static org.assertj.core.api.Assertions.assertThat;

import java.lang.reflect.Method;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

class Lesson4Test {

private ExpressionCalculator calculator;

@BeforeEach
void setUp() {
calculator = new ExpressionCalculator();
}

@Test
void testCalculate() {
// Arrange
var a = 1;
var b = 2;
var c = 3;
var d = 4;
var e = 5;
var expected = ((a + b) * c) / Math.pow(d, e);

// Act
double actual = calculator.calculate(a, b, c, d, e);

// Assert
assertThat(actual).isEqualTo(expected);
}

@Test
void testAdd_works() throws Exception {
// Arrange
Method method = calculator.getClass().getDeclaredMethod("add", double.class, double.class);

// Act
var result = (double) method.invoke(calculator, 1, 2);

// Assert
assertThat(result).isEqualTo(3);
}

@Test
void testMultipy_works() throws Exception {
// Arrange
Method method = calculator.getClass().getDeclaredMethod("multiply", double.class, double.class);

// Act
var result = (double) method.invoke(calculator, 1, 2);

// Assert
assertThat(result).isEqualTo(2);
}

@Test
void testDivide_works() throws Exception {
// Arrange
Method method = calculator.getClass().getDeclaredMethod("divide", double.class, double.class);

// Act
var result = (double) method.invoke(calculator, 1, 2);

// Assert
assertThat(result).isEqualTo(0.5d);
}

@Test
void testPow_works() throws Exception {
// Arrange
Method method = calculator.getClass().getDeclaredMethod("pow", double.class, double.class);

// Act
var result = (double) method.invoke(calculator, 2, 3);

// Assert
assertThat(result).isEqualTo(8);
}
}
Binary file not shown.
6 changes: 6 additions & 0 deletions lesson_04/expression/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,6 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.0.2-bin.zip
networkTimeout=10000
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

0 comments on commit e52620a

Please sign in to comment.